zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构、常量等。

zlib使用过程

压缩过程:deflateInit() ->deflate() ->deflateEnd();  对应的解压过程 inflateInit() ->  inflate() ->  inflateEnd(); 
压缩过程:deflateInit2() ->deflate() ->deflateEnd();  对应的解压过程 inflateInit2() ->  inflate() ->  inflateEnd(); 

zlib使用的实例请看:
http://www.zlib.net/zlib_how.html 注释内容详细(英文)

web服务器是如何通过压缩数据,web服务器的gzip模块的实现  我自己写的(中文)

zlib解压缩的实现实例(来自百度百科,本人未加正式,请谅解)


常用的数据结构
typedef struct z_stream_s {
    z_const Bytef *next_in;     //要压缩数据的首地址
    uInt     avail_in;  //压缩数据的长度
    uLong    total_in;  //压缩数据缓冲区的长度

    Bytef    *next_out; //压缩数据保存位置。
    uInt     avail_out; //存放压缩数据位置的首地址
    uLong    total_out; //存放压缩数据位置的大小

    z_const char *msg;  //存放最近的错误信息,NULL表示没有错误
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  // 表示数据类型,文本或者二进制
    uLong   adler;      /* adler32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;
对于z_stream我们一般使用
        z_stream stream;
        在deflateInit()或者inflateInit()前设置的参数,初始化参数设置
        stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
stream.avail_in = 0;
stream.next_in = Z_NULL;
        在deflate()或inflate前设置的参数,压缩前的参数设置
        strm.avail_in = in_len;
        strm.next_in = in;
        strm.avail_out = out_len;
        strm.next_out = out;
常用的常量
用来设置压缩和解压缩时,结果数据输出的方式,具体区别没有看懂的(为了避免误导大家,大家尽量看http://www.zlib.net/manual.html英文帮助吧)

#define Z_NO_FLUSH      0  //没有缓存,直接写入到结果中
#define Z_PARTIAL_FLUSH 1   
#define Z_SYNC_FLUSH    2    
#define Z_FULL_FLUSH    3
#define Z_FINISH        4    //采用此种方式,压缩将会变成单步执行。
#define Z_BLOCK         5
#define Z_TREES         6

函数返回值得定义

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
注释:负值是错误,正值用于特别,但正常活动。

定义常用的压缩级别
#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
注释:压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数据

压缩算法的选择
#define Z_FILTERED            1    //Huffman编码和字符串匹配结合
#define Z_HUFFMAN_ONLY        2  //仅采用霍夫曼编码,没有字符匹配
#define Z_RLE                 3    //限制相匹配的距离为1
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0  //默认压缩方法。

Possible values of the data_type field (though see inflate()).

#define Z_BINARY   0
#define Z_TEXT     1
#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN  2

默认的压缩方式,仅支持当前一种

#define Z_DEFLATED   8

常用的函数
int deflateInit ((z_streamp strm, int level));
include: zlib.h
description: 初始化压缩状态,关联相关的z_stream数据结构和压缩比例
parameter:
    strm: 要关联的z_stream数据结构
    level:压缩比例,压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数据

int deflateInit2 ((z_streamp strm, //关联的数据结构
                               int  level,   
                               int  method,
                               int  windowBits,
                               int  memLevel,
                                int  strategy));
include: zlib.h
description: 压缩的初始化
parameter:
    strm:关联的数据结构    
    level:压缩级别,压缩级别是一个0-9的数字,0压缩速度最快(压缩的过程),9压缩速度最慢,压缩率最大,0不压缩数
    method:压缩的模式,现在只有一种。Z_DEFLATED(表示数字8)
    windowBits:表示处理raw deflate的方法。windowBits为8..15,也可以为-8...-15。当值为16时,将会加上一个简单gzip头部和尾部。
    memLevel:指定的内部压缩状态,应该分配多少内存。 memLevel=1使用的最小内存,但很慢,降低了压缩比; memLevel=9使用的最大内存以获得最佳的速度。默认值是8。请参阅作为的函数windowBits和memLevel的使用的总内存zconf.h。
    strategy:压缩的策略
int deflate ((z_streamp strm, int flush));
include: zlib.h

description: 压缩数据
parameter:
    strm: 关联的数据结构,要压缩的数据、长度、压缩数据的存放位置和可用大小,都在其中设置的
    flush: 采用何种法师将压缩的数据写到缓冲区中。

int deflateEnd ((z_streamp strm))
include: zlib.h
description: 压缩结束
parameter:
    strm: 关联的数据结构,释放资源

【神经网络与深度学习】ZLIB介绍的更多相关文章

  1. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  2. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  3. 深度学习与CV教程(8) | 常见深度学习框架介绍

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  4. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

  5. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

    [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

  6. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  7. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  8. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

  9. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

    [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

  10. 【神经网络与深度学习】【Matlab开发】caffe-windows使能Matlab2015b接口

    [神经网络与深度学习][Matlab开发]caffe-windows使能Matlab2015b接口 标签:[神经网络与深度学习] [Matlab开发] 主要是想全部来一次,所以使能了Matlab的接口 ...

随机推荐

  1. js深度克隆

    function highClone(oldObj){ var cloneObj; if(oldObj.constructor==Object || oldObj.constructor==Array ...

  2. How to Fix "Linux Failure to Download extra data files for ttf-mscorefonts-installer" error

    How to Fix "Linux Failure to Download extra data files for ttf-mscorefonts-installer" erro ...

  3. LibreOffice/Calc:带条件判断的求和

    本文适用于LibreOffice Calc 5.1.6.2 + Ubuntu 16.04,熊猫帮帮主@cnblogs 2018/3/7 以下图为例,假设要根据C列对D列中被选中单元进行求和,即对D列中 ...

  4. SDOI2019R2游记

    Day 0 上午到了济南,住在了山下.下午颓颓颓,zhy在玩炉石,我在...打元气!我的机器人终于不掉HP通关了呢,送的皮肤好好看啊. Day 1 到考场后,打开题面,一看第一题似乎很可做啊,好像可以 ...

  5. BZOJ 2651 城市改建 树形DP+模拟?

    题意 给一颗树,删除一条边再加一条边,使它仍为一颗树且任意两点间的距离的最大值最小. 题目数据范围描述有问题,n为1或重建不能使任意两点距离最大值变小,可以输出任意答案. 分析 删除一条边后会使它变成 ...

  6. 最大数maxnumber (HYSBZ 1012)(线段树区间查询和单点修改)(优雅的暴力)

    Problem 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作 ...

  7. Xshell安装教程及Xshell安装程序集组件时出错的解决方法

    部分小伙伴在安装Xshell的时候可能会遇到这个问题:“Xshell5安装程序集组件{0D7E67F6-1A6A-3A26-AF95-B8E83DDCCC3F}时出错.HRESULT0x80070BC ...

  8. BZOJ3331压力

    码量略大. 题意就是求路径必经点. tarjan缩点,所有的非割点只有是起点终点时才必经,直接开个ans数组就OK了. 至于割点,因为缩完点之后的图是vDcc和割点共同组成的,而且题目说连通,那就是棵 ...

  9. 一本学习HTTP很好的书《图解HTTP》

    网上电子版的一堆(*^__^*) 嘻嘻……

  10. CentOS7 docker服务部署

    以下命令可以在root身份下保存为shell脚本直接bash一次性执行 参考: https://yeasy.gitbooks.io/docker_practice/install/centos.htm ...