zlib是用于数据压缩的函数库,使用DEFLATE算法。最初是为libpng函数库开发,后来普遍为许多软件所使用。zlib为自由软件。
DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
zlib在业界应用广泛,包括:
Linux kernel:使用zlib实作网络协定的压缩、档案系统的压缩以及开机时解压缩内核。
libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。
Apache:使用zlib实作http 1.1。
OpenSSH、OpenSSL:以zlib达到最佳化加密网络传输。
FFmpeg:以zlib读写Matroska等以DEFLATE算法压缩的多媒体串流格式。
rsync:以zlib最佳化远端同步时的传输。
SVN、Git和 CVS,使用zlib来压缩和远端仓库的通讯流量。
dpkg和RPM等包管理软件:以zlib解压缩RPM或者其他封包。
因其代码的可移植性,宽松的许可以及较小的内存占用,zlib在许多嵌入式设备中也有应用。
从zlib官网(http://zlib.net/)上可以下载到源码和库,zlib.h中声明了可以用的库函数,主要函数如下:
(1) int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
将源缓冲中的数据压缩并放入目的缓冲区。destLen作为入口参数时,指明目的缓冲区的字节大小。目的缓冲区至少要比源缓冲大小(sourceLen)加12个字节之后还大上0.1%。destLen作为出口参数时,指明压缩之后的数据所占的字节大小。
compress返回Z_OK表示成功;返回Z_MEM_ERROR表示没有足够内存;返回Z_BUF_ERROR表示目的缓冲区不够大。
(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
功能和compress函数一样,只多出一个参数level。level可以设置为Z_DEFAULT_COMPRESSION,或者0到9之间的数。设置为1,代表要求最高的压缩速度;设置为9,代表要求最高的压缩率;设置为0,表示不压缩;设置为Z_DEFAULT_COMPRESSION,表示要求一个适中的压缩速度和压缩率。
compress2的返回值也和compress基本相同,只多出一个Z_STREAM_ERROR,代表level参数无效。
(3) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);
将源缓冲中的数据解压缩并放入目的缓冲区。参数和compress类似。返回值也和compress基本相同,多出一个Z_DATA_ERROR,代表输入数据被破坏。
(4) deflateInit() + deflate() + deflateEnd()
3个函数结合使用完成压缩功能,具体用法参照example.c 的 test_deflate()函数。其实 compress() 函数内部就是用这3个函数来实现的(见工程的compress.c 文件)。
(5) inflateInit() + inflate() + inflateEnd()
和(4)类似,完成解压缩功能。
(6) gz开头的函数,用来操作*.gz文件。和文件stdio调用方式类似,用法参照example.c的 test_gzio()函数。
在我现在的项目中,使用zlib的目的主要是压缩和平台服务器端的通讯数据流量。我只用到了compress和uncompress函数,使用很方便。
上传了一份动态库,是zlib for wince的版本,有需要下载的可以点这里。