linux下zlib库安装及C++调用示例

C++使用zlib库进行压缩和解压,简单的封装了一下。

安装

官网地址:http://www.zlib.net/ 我下载的是:zlib-1.2.11.tar.gz。

解压:tar -zxvf zlib-1.2.11.tar.gz

cd zlib-1.2.11/

./configure --prefix=/usr/local/zlib

make

make check

make install

echo "/usr/local/zlib/lib" >> /etc/ld.so.conf

ldconfig -v

使用

压缩:

unsigned char *zlib_compress(int &len, std::string asdu)
{
    unsigned long destLen;

    // 计算缓冲区大小,并为其分配内存
    destLen = compressBound(len1+1);	
    unsigned char *dest = new unsigned char[destLen];

    // 把字符串的结束符'\0'也一并处理
    unsigned char *src = new unsigned char[len1 + 1];
    memcpy(src, (unsigned char *)asdu.c_str(), len1);
    src[len1] = '\0';

    // 压缩
    int iRet = compress(dest, &destLen, src, len1+1);
    delete[] src;

    if (Z_OK == iRet)
    {
        len = destLen;
        return dest;
    }
    else
    {
        delete[] dest;
        return NULL;
    }
}

解压:

解压稍微有点麻烦,因为zlib不提供预测解压后的大小,所以,设了个循环,每次把缓冲区加倍,解压成功就返回,失败就再加大缓冲区继续尝试解压。

unsigned char *zlib_uncompress(int &dLen, unsigned char *src, int len)
{
    unsigned long len1 = len *4;
   
    while(true)
    {
        unsigned char *d = new unsigned char[len1];
        // 调用zlib库,尝试解压
        int err = uncompress(d, &len1, src, len);

        if(err == Z_OK)
        {
            dLen = len1;
            return d;
        }
        else if(err = Z_BUF_ERROR) //缓冲区不够,加大一点,继续解压
        {
            len1 *= 4;
            delete[] d;
        }
        else // 其他问题,返回,可以更详细的判断
        {
            delete[] d;
            return NULL;
        }
    }
}

### 回答1: 压缩算法是许多应用程序中常见的功能,其中一个流行的算法称为 zlibzlib 是一种基于 DEFLATE 算法实现的数据压缩,它提供了一种方法来减小传输数据的大小,从而提高网络传输的速度和降低存储数据所需的空间。 要调用 zlib demo,需要先安装 zlib 。在 Linux 系统中,可以使用以下命令安装: sudo apt-get install zlib1g-dev 安装完成后,可以使用以下代码片段来调用 zlib demo: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <zlib.h> #define CHUNK 16384 int compress_file(char *infilename, char *outfilename) { gzFile infile = gzopen(infilename, "rb"); if (!infile) { printf("Failed to open %s for reading\n", infilename); return -1; } FILE *outfile = fopen(outfilename, "wb"); if (!outfile) { printf("Failed to open %s for writing\n", outfilename); return -1; } char buffer[CHUNK]; int num_read = 0; while ((num_read = gzread(infile, buffer, CHUNK)) > 0) { fwrite(buffer, 1, num_read, outfile); } gzclose(infile); fclose(outfile); return 0; } int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage: %s in-file out-file\n", argv[0]); return -1; } int result = compress_file(argv[1], argv[2]); if (result == -1) { printf("Failed to compress file\n"); return -1; } return 0; } 该示例程序使用 zlib 来压缩输入文件。首先,它打开输入文件并检查是否成功。然后,它打开输出文件并检查是否成功。程序使用 CHUNK 大小的缓冲区从输入文件中读取数据,然后将数据写入输出文件中。read() 函数返回的字节数用作 fwrite() 函数的第二个参数以确保写入正确的字节数。最后,程序关闭输入和输出文件并返回。 ### 回答2: zlib 是一个流行的开源压缩,可以在很多平台上使用,包括 Windows、Linux、macOS 等。使用 zlib 可以使得应用程序的数据传输更加高效,而且也能够降低存储空间的占用率。 要在 C 语言中调用 zlib ,需要先在代码中包含头文件“zlib.h”。接着就可以使用 zlib 提供的函数进行压缩和解压缩操作了。其中,最主要的两个函数是“compress”和“uncompress”。 使用“compress”函数可以将原始数据压缩为压缩后的数据,示例代码如下: ``` unsigned char compressBuffer[1024]; uLong compressBufferSize = 1024; compress(compressBuffer, &compressBufferSize, originalBuffer, originalSize); ``` 上面的代码将原始缓冲区“originalBuffer”中的数据进行压缩,并将压缩后的结果存储在“compressBuffer”中。压缩后的数据大小不超过“compressBufferSize”,所以“compressBufferSize”需要传递给函数,作为压缩后缓冲区的大小。 使用“uncompress”函数可以将压缩后的数据解压缩为原始数据,示例代码如下: ``` unsigned char uncompressBuffer[1024]; uLong uncompressBufferSize = 1024; uncompress(uncompressBuffer, &uncompressBufferSize, compressBuffer, compressBufferSize); ``` 上面的代码将压缩缓冲区“compressBuffer”中的数据进行解压缩,并将解压缩后的结果存储在“uncompressBuffer”中。解压缩后的数据大小为“uncompressBufferSize”,所以也需要传递给函数,作为解压缩后缓冲区的大小。 以上就是使用 zlib 进行压缩和解压缩操作的示例。在实际应用中,可以根据具体需求对函数进行调整,以实现更加灵活的功能。 ### 回答3: 要调用 zlib demo,需要以下几个步骤: 1.下载 zlib 首先需要从zlib的官网上下载zlib,下载完成后,解压缩文件并将其安装到系统中。如果是使用Linux系统,可以使用命令“sudo apt-get install zlib1g-dev”直接通过终端安装zlib。 2.引用头文件 需要在代码中引入zlib的头文件,一般情况下是“#include <zlib.h>”。 3.使用zlib函数 通过zlib提供的函数来执行压缩、解压等操作。例如,使用“zlibVersion()”函数可以获取当前zlib版本号;使用“deflate()”函数可以进行数据压缩;使用“inflate()”函数可以进行数据解压缩等。 在调用zlib demo时,需要注意以下几点: 1.根据需要选择使用zlib提供的哪些函数。 2.对于不同的操作,需使用不同的zlib函数进行处理。 3.在开发过程中,可以使用zlib提供的例子代码进行参考,加深对该的理解和使用。 总之,调用zlib demo需要熟悉函数的使用方法,理解操作流程,并选择合适的例子代码进行参考,以便更好地完成相应的任务。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值