zlib开发笔记(一):zlib库介绍、编译和工程模板

简介: zlib开发笔记(一):zlib库介绍、编译和工程模板

前言

  Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库。


版本编译引导


zlib库

  zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可以在任何计算机硬件和操作系统上使用。

  官网:http://www.zlib.net/

  QQ群:1047134658(点击“文件”搜索“zlib”,群内与博文同步更新)


zlib编译

步骤一:解压

步骤二:Cmake配置(mingw32版本)

步骤三:生成工程

步骤四:命令行编译

步骤五:安装install


模块化


Demo

void ZlibManager::testEnv()
{
    QString fileName = "1.txt";
    QString outFileName = "1.txt_zip";
    // 打开文件,读取进入内存
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly))
    {
        LOG;
        return;
    }
    QByteArray byteArray = file.readAll();
    LOG << byteArray.size();
    byteArray.append((char)0x00);
    LOG << "origin size:" << byteArray.size() << ":" << QString(byteArray);
    file.close();
    // 计算压缩后的文件大小
    int len = compressBound(byteArray.size());
    LOG << len << (uLong)byteArray.size();
    QByteArray compressByteArray = QByteArray(len, 0x00);
    int ret = compress((uchar *)compressByteArray.data(), (uLong *)&len, (uchar *)byteArray.data(), (uLong)byteArray.size());
    LOG << ret << len;
    if(Z_OK == ret)
    {
        LOG << "Succeed to compress" << byteArray.size() << "to" << len;
    }
    //  压缩后存入文件
    QFile outFile(outFileName);
    if(!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        LOG;
        return;
    }
    outFile.write(compressByteArray, len);
    outFile.close();
    LOG << QString(compressByteArray.mid(0, len).toHex(' '));
    // 解压
    QByteArray unCompressByteArray = QByteArray(1024, 0x00);
    // 入坑一 unCompressLen传入的时候,作为指示缓存区的长度,运行完后,作为传出实际的长度
    int unCompressLen = unCompressByteArray.size();
    LOG << unCompressByteArray.size();
    ret = uncompress((uchar *)unCompressByteArray.data(), (uLong *)&unCompressLen, (uchar *)compressByteArray.data(), (uLong)len);
    LOG << ret << unCompressLen << len;
    if(Z_OK == ret)
    {
        LOG << "Succeed to uncompress" << compressByteArray.size() << "to" << unCompressLen;
    }
    // 解压后的存文文件 2.txt
    QString fileName2 = "2.txt";
    QFile file2(fileName2);
    if(!file2.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        LOG;
        return;
    }
    file2.write(unCompressByteArray, unCompressLen);
    file2.close();
    LOG << "restore:" << QString(unCompressByteArray.mid(0, unCompressLen));
}


运行结果


工程模板v1.0.0

  对应工程模板:zlibDemo_v1.0.0_基础模板_测试压缩解压.rar


相关文章
|
Unix 编译器 开发者
Qt5.14.2 轻松掌握Qt中的压缩与解压缩:QuaZIP的神秘面纱与实战演练之windows环境编译
Qt5.14.2 轻松掌握Qt中的压缩与解压缩:QuaZIP的神秘面纱与实战演练之windows环境编译
1136 0
|
算法 数据可视化 程序员
【Qt UI】调色板QPalette类在Qt编程中的应用
【Qt UI】调色板QPalette类在Qt编程中的应用
572 0
|
API PHP C++
Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)
Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)
2172 0
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
8710 4
|
算法 C语言 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(一)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
4152 1
|
存储 运维 监控
运维.Linux下执行定时任务(中:Cron的常用替代方案)
本文是关于Linux下执行定时任务系列的第二部分,主要探讨除了Cron之外的常用替代方案。介绍了Systemd Timers、Anacron及at命令三种工具,它们分别适用于不同场景下的定时任务需求。文章详细分析了每种工具的特点、工作原理、基本使用方法及其高级功能,并对比了它们各自的优缺点,帮助读者根据实际情况选择最适合的定时任务解决方案。此外,还提供了指向具体实例和进一步阅读材料的链接。
575 4
运维.Linux下执行定时任务(中:Cron的常用替代方案)
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
2576 2
|
自然语言处理 IDE 开发工具
通义灵码编程智能体上线,支持Qwen3模型
通义灵码最全使用指南,一键收藏。
127918 31
通义灵码编程智能体上线,支持Qwen3模型
|
10月前
|
网络协议 算法 网络性能优化
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。