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解压缩。

 

posted @ 2021-05-13 19:26  castor_xu  阅读(1659)  评论(0编辑  收藏  举报