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;
        }
    }
}

你可能感兴趣的:(C++,linux,c++,zlib)