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