当前位置: 首页 > news >正文

Qt C++ 常用压缩库推荐 快速压缩 解压缩数据

在Qt C++中,如果你需要快速压缩和解压缩数据,可以使用以下几种库:

1. zlib

  • 简介: zlib 是一个非常流行的压缩库,支持 DEFLATE 压缩算法。它被广泛用于各种应用程序中,包括Qt。

  • 集成: Qt 本身已经集成了 zlib,因此你可以直接使用 Qt 提供的类来进行压缩和解压缩操作。

  • 示例:

  • #include <QByteArray>
    #include <QDataStream>
    #include <zlib.h>
    
    QByteArray compressData(const QByteArray &data) {
        QByteArray compressedData;
        z_stream zs;
        memset(&zs, 0, sizeof(zs));
    
        if (deflateInit(&zs, Z_BEST_COMPRESSION) != Z_OK) {
            return QByteArray();
        }
    
        zs.next_in = (Bytef*)data.data();
        zs.avail_in = data.size();
    
        int ret;
        char outbuffer[32768];
        do {
            zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
            zs.avail_out = sizeof(outbuffer);
    
            ret = deflate(&zs, Z_FINISH);
    
            compressedData.append(outbuffer, sizeof(outbuffer) - zs.avail_out);
        } while (ret == Z_OK);
    
        deflateEnd(&zs);
    
        if (ret != Z_STREAM_END) {
            return QByteArray();
        }
    
        return compressedData;
    }
    
    QByteArray decompressData(const QByteArray &compressedData) {
        QByteArray decompressedData;
        z_stream zs;
        memset(&zs, 0, sizeof(zs));
    
        if (inflateInit(&zs) != Z_OK) {
            return QByteArray();
        }
    
        zs.next_in = (Bytef*)compressedData.data();
        zs.avail_in = compressedData.size();
    
        int ret;
        char outbuffer[32768];
        do {
            zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
            zs.avail_out = sizeof(outbuffer);
    
            ret = inflate(&zs, 0);
    
            decompressedData.append(outbuffer, sizeof(outbuffer) - zs.avail_out);
        } while (ret == Z_OK);
    
        inflateEnd(&zs);
    
        if (ret != Z_STREAM_END) {
            return QByteArray();
        }
    
        return decompressedData;
    }

 2. QuaZip

  • 简介: QuaZip 是一个基于 zlib 的 Qt 封装库,专门用于处理 ZIP 文件。它提供了更高级的接口来处理 ZIP 文件,包括压缩和解压缩。

  • 集成: 你需要手动将 QuaZip 集成到你的项目中。

  • 示例:

  • #include <quazip/quazip.h>
    #include <quazip/quazipfile.h>
    
    void compressFile(const QString &filePath, const QString &zipPath) {
        QuaZip zip(zipPath);
        zip.open(QuaZip::mdCreate);
    
        QuaZipFile outFile(&zip);
        outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(QFileInfo(filePath).fileName(), filePath));
    
        QFile inFile(filePath);
        inFile.open(QIODevice::ReadOnly);
        outFile.write(inFile.readAll());
    
        outFile.close();
        zip.close();
    }
    
    void decompressFile(const QString &zipPath, const QString &extractPath) {
        QuaZip zip(zipPath);
        zip.open(QuaZip::mdUnzip);
    
        for (bool more = zip.goToFirstFile(); more; more = zip.goToNextFile()) {
            QuaZipFile inFile(&zip);
            inFile.open(QIODevice::ReadOnly);
    
            QFile outFile(extractPath + "/" + inFile.getActualFileName());
            outFile.open(QIODevice::WriteOnly);
            outFile.write(inFile.readAll());
    
            inFile.close();
            outFile.close();
        }
    
        zip.close();
    }

3. LZ4

  • 简介: LZ4 是一个非常快速的压缩算法,专注于压缩和解压缩速度。它适用于需要快速压缩和解压缩的场景。

  • 集成: 你需要手动将 LZ4 集成到你的项目中。

  • 示例:

#include <lz4.h>
#include <QByteArray>

QByteArray compressData(const QByteArray &data) {
    int maxCompressedSize = LZ4_compressBound(data.size());
    QByteArray compressedData(maxCompressedSize, 0);

    int compressedSize = LZ4_compress_default(data.data(), compressedData.data(), data.size(), maxCompressedSize);
    compressedData.resize(compressedSize);

    return compressedData;
}

QByteArray decompressData(const QByteArray &compressedData, int originalSize) {
    QByteArray decompressedData(originalSize, 0);

    int decompressedSize = LZ4_decompress_safe(compressedData.data(), decompressedData.data(), compressedData.size(), originalSize);
    decompressedData.resize(decompressedSize);

    return decompressedData;
}

4. Zstandard (zstd)

  • 简介: Zstandard 是 Facebook 开发的一个压缩算法,提供了高压缩比和快速的压缩/解压缩速度。

  • 集成: 你需要手动将 Zstandard 集成到你的项目中。

  • 示例:

#include <zstd.h>
#include <QByteArray>

QByteArray compressData(const QByteArray &data) {
    size_t maxCompressedSize = ZSTD_compressBound(data.size());
    QByteArray compressedData(maxCompressedSize, 0);

    size_t compressedSize = ZSTD_compress(compressedData.data(), maxCompressedSize, data.data(), data.size(), 1);
    compressedData.resize(compressedSize);

    return compressedData;
}

QByteArray decompressData(const QByteArray &compressedData, int originalSize) {
    QByteArray decompressedData(originalSize, 0);

    size_t decompressedSize = ZSTD_decompress(decompressedData.data(), originalSize, compressedData.data(), compressedData.size());
    decompressedData.resize(decompressedSize);

    return decompressedData;
}

总结

  • zlib: 适合大多数场景,Qt 已经集成。

  • QuaZip: 适合处理 ZIP 文件,基于 zlib。

  • LZ4: 适合需要极快压缩和解压缩速度的场景。

  • Zstandard: 提供高压缩比和较快的压缩/解压缩速度。

根据你的需求选择合适的库。如果你需要处理 ZIP 文件,QuaZip 是一个不错的选择;如果你需要极快的压缩速度,LZ4 或 Zstandard 可能更适合。

相关文章:

  • Java是怎么解决并发问题的?
  • 高效图像处理工具:从需求分析到落地实现
  • 【vue + JS】OCR图片识别、文字识别
  • react对比vue的核心属性
  • 2340单点修改、区间查询
  • 独立开发记录:使用Trae和Cloudflare快速搭建了自己的个人博客
  • 深度学习与大模型-矩阵
  • 解数独 (leetcode 37
  • 生化混合智能技术(Biochemical Hybrid Intelligence, BHI)解析与应用
  • devServer changeOrigin不管用
  • 101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠
  • RTSP协议规范与SmartMediaKit播放器技术解析
  • 【Golang】第五弹----函数
  • go-文件缓存与锁
  • stm32 晶振换算
  • 【蔚蓝星球的节日】世界海洋日的探索与海洋的重要性
  • 【Rust基础】Rust后端开发常用库
  • ssm框架整合
  • 芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选
  • 哈尔滨算力服务器托管推荐-青蛙云
  • 为俄乌一日三通电话,这里成“关键战场”?
  • 财政部:4月份中央收入增长1.6%,今年以来首月实现正增长
  • 国家发改委:安全是低空经济发展的首要前提,稳妥推进低空旅游、航空运动等发展
  • 新华每日电讯:把纪律的螺丝拧得紧而又紧
  • 慢品巴陵,看总编辑眼中的岳阳如何书写“山水人文答卷”
  • 15年全程免费,内蒙古准格尔旗实现幼儿园到高中0学费