聊聊字符集编码与数据压缩( 六 )


#define Z_BEST_COMPRESSION 9 //压缩优先,但是速度会有些慢
#define Z_DEFAULT_COMPRESSION (-1) //默认选项 , compress 里面用的就是这个选

返回值:
成功返回Z_OK , 没有足够的内存则返回 Z_MEM_ERROR , 若压缩级别无效 , 返回Z_STREAM_ERROR , 版本不兼容则返回 Z_VERSION_ERROR 。如果没有错误信息则 msg 被设置为 0 。
z_stream:这个是压缩上下文 。
strm.zalloc = NULL;
strm.zfree = NULL;
strm.opaque = NULL;
strm.next_in = 你的待压缩数据
strm.next_out = 压缩以后数据存储的 buffer
strm.avail_in = 待压缩数据的长度
strm.avail_out = 压缩数据存储 buffer 的长度.
method: 值只有一个 , 当前唯一的 defalte 压缩方法 , 用于以后扩展
#define Z_DEFLATED 8
/* The deflate compression method (the only one supported in this version)
*/
windowBits: 窗口比特数
-(15 ~ 8) : 纯 deflate 压缩
+(15 ~ 8) : 带 zlib 头和尾
> 16 : 带 gzip 头和尾
memLevel: 目前只有一个选项 , MAX_MEM_LEVEL , 无非是运行过程中对内存使用的限制.
/* Maximum value for memLevel in deflateInit2 */
#ifndef MAX_MEM_LEVEL
# ifdef MAXSEG_64K
# define MAX_MEM_LEVEL 8
# else
# define MAX_MEM_LEVEL 9
# endif
#endif
strategy :用于调整压缩算法 , 直接给默认就行 Z_DEFAULT_STRATEGY
#define Z_FILTERED 1 //用于由 filter(或者称为 predictor)生成的数据
#define Z_HUFFMAN_ONLY 2 //用于强制哈夫曼编码(不做字符匹配)
#define Z_RLE 3 //限制匹配长度为 1
#define Z_FIXED 4 //阻止使用动态哈夫曼编码 , 从而允许获得更简单的解码
#define Z_DEFAULT_STRATEGY 0 //用于普通数据
Z_FILTERED , 用于由 filter(或者称为 predictor)生成的数据.过滤的数据包含很多小的随机数据 。这种情况下 , 压缩算法能够获得更好的压缩效果 。该选项可以强制更多的哈夫 曼 编 码 和 更 少 的 字 符 匹 配。有 时 候 可 以 作 为 Z_DEFAULT_STRATEGY 和
Z_HUFFMAN_ONLY 的折衷 。
Z_FIXED , 阻止使用动态哈夫曼编码 , 从而允许获得更简单的解码 。
strategy 参数只影响压缩比 , 而不会影响到压缩输出的正确性 , 因此没有正确的设置也不要紧
deflate函数尽可能压缩数据 , 当输入缓存为空或输出缓冲满了就会停止 , 带来输出延迟 , 除非强行刷新缓冲区 。

聊聊字符集编码与数据压缩

文章插图
 
deflate 会执行下面的一个或者两个动作都执行 , avail_in或avail_out 被设置 , 使用提供更多输入数据和消耗更多输出数据的方式 , 
(1)从 next_in 开始压缩输入数据 , 进而更新next_in 和 avail_in 。如果不是所有输入数据可以被处理(缓冲没有足够的空间) , next_in和avail_in会更新 , 当再次调用deflate()函数时输入数据会从这一点开始被处理 。从而更新avail_in 或 avail_out;avail_out 在函数调用之前千万不能为 0 。应用程序可以随时消耗被压缩的输出数据 。如输出缓存满或每次调用deflate()之后 , 若deflate返回Z_OK并avail_out 为 0 时 , deflate()必须再次被调用(说明输出缓存区还有数据应该被读取)
(2)next_out 开始提供更多输出数据从而更新 next_out 和 avail_out , 如果 flush参数不是为 0 的化这个动作是强制性的 , 经常性的强制刷新缓存会降低压缩比率 , 只有必要的时候去设置这个参数 。
Int flush 的参数:
Z_NO_FLUSH:允许压缩算法累计产生多少数据再输出 , 以达到压缩率最高 。
Z_SYNC_FLUSH:将所有等待输出的数据刷新到输出缓冲区 , 以字节为边界进行对齐 。这个可能会降低压缩算法的效率 , 只用于必要的时候 。
Z_FINISH:输入和待输出的数据都被处理完 , 则返回 Z_STREAM_END 。如果返回 Z_OK or Z_BUF_ERROR 则需要再次调用 Z_FINISH 直到返回 Z_STREAM_END 。
deflateEnd:资源释放
压缩完成后 , 释放空间 , 仅仅释放deflateInit 中申请的空间 , 自己申请的空间还是要自己释放 。
聊聊字符集编码与数据压缩

文章插图
 
解压函数
inflateInit :解压初始化函数 , 内部调用的inflateInit2 。


推荐阅读