ZLib库使用详细教程 以及标准ZLib函数和QT自带压缩函数比较

发布于:2025-02-11 ⋅ 阅读:(83) ⋅ 点赞:(0)

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



网站公告

今日签到

点亮在社区的每一天
去签到