zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构、常量等。
zlib使用过程
压缩过程:deflateInit() ->deflate() ->deflateEnd(); 对应的解压过程 inflateInit() -> inflate() -> inflateEnd();
压缩过程:deflateInit2() ->deflate() ->deflateEnd(); 对应的解压过程 inflateInit2() -> inflate() -> inflateEnd();
zlib使用的实例请看:
http://www.zlib.net/zlib_how.html 注释内容详细(英文)
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: 关联的数据结构,释放资源