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解压缩。
原文链接: https://www.cnblogs.com/castor-xu/p/14765889.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/210508
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!