zlib库在项目工程中数据的应用

gzip的基础是deflate,deflate是LZ77与哈夫曼编码的一个组合体.文件格式说明:10字节的头,包含幻数,版本号和时间戳 可选的扩展头,如原文件名 文件体,包括deflate压缩的数据 8字节的尾注,包括crc-32和未压缩的原始数据长度

一、数据头

zlib能使用一个gzip数据头,zlib数据头或者不使用数据头压缩数据。

通常,数据压缩使用zlib数据头,因为提供错误数据检测。若数据压缩不使用数据头写入时,结果是没错误检测的原始DEFLATE数据,那解压时就不知道在哪结束了。

gzip数据头比zlib数据头大,它保存了文件名和其他文件系统信息。

注意:zlib库本身不能创建一个gzip文件,但能用数据压缩写入到一个有gzip文件头的文件中。

二、算法

zlib支持LZ77的变种算法,DEFLATE的算法。对于压缩和解压缩,没数据长度的限制,重复调用库函数允许处理无限的数据块,就算计数变量溢出,,也不会影响实际的压缩和解压缩。函数库提供了对CPU和内存的控制能力。

压缩是可以针对特定类型的数据进行的,若数据包含很长的重复数据,可用RLE会更好些。

流的数据结构:

typedef struct z_stream_s {Bytef *next_in; /* next input byte */uIntavail_in; /* number of bytes available at next_in */uLong total_in; /* total nb of input bytes read so far */Bytef *next_out; /* next output byte should be put there */uIntavail_out; /* remaining free space at next_out */uLong total_out; /* total nb of bytes output so far */char*msg;/* last error message, NULL if no error */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 */voidpfopaque; /* private data object passed to zalloc and zfree */intdata_type; /* best guess about the data type: binary or text */uLong adler;/* adler32 value of the uncompressed data */uLong reserved; /* reserved for future use */} z_stream;

介绍下相应的数据结构内部的变量:

Bytef *next_in输入的源字符串

uInt avail_in输入源字符串长度,当avail_in下降到0时,必须更新next_in和avail_in

Bytef *next_out输出字符串

uInt avail_out在next_out中的可用空闲空间,当avail_out下降到0时,必须更新next_out

alloc_func zalloc

内存分配函数,Innodb里对应的函数指针是page_zip_zalloc

如不指定需要设置为NULL

free_func zfree内存释放函数,Innodb里对应函数指针为page_zip_free如不指定需要设置为NULL

voidpf opaque会被作为参数传递给zalloc和zfree,在innodb里使用的是mem_heap.

deflateInit2(strm, level, method, windowBits, memLevel, strategy)

@1,z_stream对象

@2,压缩级别

@3,值为Z_DEFLATED,当前唯一的defalte压缩方法,用于以后扩展

@4,窗口比特数

@5,memlevel值为1将使用最小的内存但更慢并降低压缩比;memlevel值为9时,会使用最大内存来获得最快的速度。默认值为8

@6,用于调整压缩算法

deflateEnd(strm)

所有动态分配的数据结构都被释放掉,并抛弃所有未完成的输入

成功时返回Z_OK,失败时返回Z_STREAM_ERROR

deflateBound(strm, len)

预判压缩的长度,可直接用这个长度

deflate(strm, flush)

从next_in开始压缩输入数据从而更新next_in和avail_in;

若不是所有输入数据可以被处理(因为输出缓冲没有足够的空间),next_in和avail_in会更新;

当再次调用deflate()函数时输入数据会从这一点开始被处理;

从next_out开始提供更多输出数据从而更新next_out和avail_out;

如果flush参数不是为0的话这个动作是强制性的,经常性的强制刷新缓冲区会降低压缩比率;

所以只有必要的时候才会设置这个参数(在交际程序时),一些数据也会输出即使刷新没有被设置。

inflateInit2(strm, windowBits)

要温暖还是怕麻烦。

zlib库在项目工程中数据的应用

相关文章:

你感兴趣的文章:

标签云: