zlib应用
1. 下载与安装
官网地址是:http://www.zlib.net/,目前最新的版本是1.2.11。下载的文件包为zlib-1.2.11.tar.gz
在Linux下解压,然后在终端中进入其文件夹,之后使用如下命令:
#配置 ./config #编译 sudo make #安装 sudo make install #加载配置 ldconfig
就安装完成了。
2. 如何使用
源文件中加入#include “zlib.h”,编译选项中加入"-lz",例如:
gcc -o ztest zlibtest.c -lz
如果是使用的VS Code,则在生成的tasks.json中加入-lz即可,如下:
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc build active file", "command": "/usr/bin/gcc", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-lz"//这里 ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "compiler: /usr/bin/gcc" } ] }
3. 程序测试
为了便于数据的压缩和解压缩,提供了实用函数,包括了compress和uncompress,直接上代码:
#include <stdio.h> #include "zlib.h" int main() { char strSrc[] = "aaaaaaabbbbbbbbbbbbbbbcccccccccccc"; char buf[1024] = {0}, strDst[1024] = {0}; long srcLen,bufLen,dstLen; srcLen = sizeof(strSrc); bufLen = sizeof(buf); dstLen = sizeof(strDst); printf("zlib Version:\t%s\n", zlibVersion()); printf("Original String Length=%ld\n",srcLen); //compress printf("Compressing...\n"); compress(buf,&bufLen,strSrc,srcLen); printf("Compressed Length:%ld\n", bufLen); printf("Compressed String:%s\n", buf); /uncompress printf("Uncompressing...\n"); uncompress(strDst, &dstLen, buf, bufLen); printf("Uncompressed Length:%ld\n", dstLen); printf("Uncompressed String:%s\n", strDst); return 0; }
运行效果如下:
zlib Version: 1.2.11 Original String Length=35 Compressing... Compressed Length:17 Compressed String:x�KL�$T�� Uncompressing... Uncompressed Length:35 Uncompressed String:aaaaaaabbbbbbbbbbbbbbbcccccccccccc
这里使用了compress和uncompress这两个函数分别实现压缩和解压缩。
函数定义和说明如下:
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen));
是将源缓冲区的数据压缩后放入目标缓冲区,其中dest和source分别是目标缓冲区和源缓冲区,sourceLen是源缓冲区中数据的长度(以字节计算),而destLen是目标缓冲区的长度(同样以字节计算),该处提供时,至少是compressBound(sourceLen),程序返回后,该值就是实际压缩后的数据长度(以字节计算),所以不放心的时候,可以使用compressBound(sourceLen)的返回值给destLen赋值,上例的代码中,该过程将返回48(没想到居然比源数据长度还大),不过这个提供了一个比较好的估计,我们可以在compressBound以后,通过动态内存分配创建目标缓冲区。函数的返回值如下:
Z_OK:函数执行成功
Z_MEM_ERROR:内存不足
Z_BUF_ERROR:目标缓冲区空间不足
另外,还提供了compress2函数,定义差不多:
ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level));
主要是最后多了一个level的压缩级别,可以是如下几个值:
#define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1)
compress函数相当于是compress2在压缩等级为Z_DEFAULT_COMPRESSION时的效果。
解压函数uncompress定义如下:
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen));
含义与compress类似,此处不再赘述,参考官网手册,如果是使用compress2压缩的,则要使用对应的uncompress解压缩。