1. 下载Zlib
官网下载地址如下:http://www.zlib.net/
2. 利用cmake编译zlib
有两种方法可以打开cmake-gui
- win+R输入cmd打开命令行,在命令行中输入cmake-gui可以直接打开应用界面
- 找到你一开始安装cmake的文件夹,在bin子文件夹中双击cmake-gui也可以打开
标题应用打开后,输入zlib源文件的位置,以及build文件夹的位置
其中,build文件夹需要自己新建空文件夹,一般会选择建在源文件的目录下
上面的红色不用管,从左到右依次点击下方三个按钮
另:如果点击configure后,红色依旧存在,则需要点击红色,把上面需要的前置路径去配置好
第三步:利用VS2022安装zlib
在上述点击Open Project后,会自动打开VS2022,找到INSTALL子项,右键去设置为启动项
[图片]
设置成为启动项后,再次右键点击去生成,若显示为下图,则表示安装成功
第四步:检查zlib是否安装与配置成功
打开C盘的program file文件夹,看到有zlib文件夹则表示安装成功
报错:
实际运行时,发现报错了,如下:
启动VS以管理员身份运行,然后打开项目即可。这种原因是CMAKE_INSTALL_PREFIX设置为C盘,C盘有权限所以有此报错。
3. Zlib和QT自带的zlib效果比较
经测试,QT自带的压缩字符串会比标准的ZLib库多前面的四个字节大小,后面的字符内容是完全一样的。
3.1 qt自带的zlib使用
使用qCompress()和qUncompress()函数来进行压缩和解压操作:
QByteArray compressString(const QString &str) {
// 将QString转换为UTF-8编码的QByteArray
QByteArray byteArray = str.toUtf8();
// 使用qCompress进行压缩
return qCompress(byteArray);
}
QString decompressString(const QByteArray &compressedData) {
// 解压缩数据
QByteArray byteArray = qUncompress(compressedData);
// 将QByteArray转换为QString,假设它是UTF-8编码
return QString::fromUtf8(byteArray);
}
3.2 标准Zlib库使用
添加include引用目录,添加zlib\lib文件夹中的库文件zlibd.lib
//压缩
char* Compress(char* src,int srcLen, int* comprLen){
int compressrate = 2;
int err;
int len = strlen(src) + 1;
std::cout << "len:"<<len<<",srcLen:"<<srcLen<<std::endl;
if(len != srcLen){
std::cout << "strlen != srcLen" << std::endl;
}
*comprLen = len*compressrate*sizeof(int);
std::cout << "ori comprLen:" << *comprLen << std::endl;
Byte *compr = (Byte*)calloc((uInt)(*comprLen), 1);
if (compr == Z_NULL) {
printf("out of memory\n");
return NULL;
}
err = compress(compr,(uLong*)comprLen,(const Bytef*)src,(uLong)len);
// CHECK_ERR(err, "compress");
return (char*)compr;
}
//解压缩
char* Uncompress(char* compr, int comprLen,int& uncomprLen){
int compressrate = 2;
uncomprLen = comprLen * compressrate * sizeof(int);
std::cout << "ori uncomprLen:" << uncomprLen << std::endl;
Byte *uncompr = (Byte*)calloc((uInt)(uncomprLen), 1);
if (uncompr == Z_NULL) {
printf("out of memory\n");
return NULL;
}
int err;
err = uncompress(uncompr, (uLong*)(&uncomprLen),
(Byte*)compr, (uLong)comprLen);
// CHECK_ERR(err, "uncompress");
return (char*)uncompr;
}