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

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 可能更适合。

相关文章:

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

在Qt C中&#xff0c;如果你需要快速压缩和解压缩数据&#xff0c;可以使用以下几种库&#xff1a; 1. zlib 简介: zlib 是一个非常流行的压缩库&#xff0c;支持 DEFLATE 压缩算法。它被广泛用于各种应用程序中&#xff0c;包括Qt。 集成: Qt 本身已经集成了 zlib&#xff0…...

架构师面试(十五):熔断设计

问题 某电商平台经常需要在大促运营活动中暂停评论、退款等业务&#xff0c;基于服务治理的设计理念&#xff0c;我们需要对该电商平台微服务系统的【服务熔断】进行设计&#xff0c;对此下面描述中说法正确的有哪几项呢&#xff1f; A. 服务管控系统管理着平台中所有服务之间…...

解析GNGGA数据,C语言单片机

GPS模块的一帧数据是: $GNGGA,130333.000,4143.43651,N,12328.96485,E,1,14,1.2,93.1,M,0.0,M,,*45 $GNGLL,4143.43651,N,12328.96485,E,130333.000,A,A*4D $GPGSA,A,3,05,07,11,13,20,29,30,195,,,,,2.3,1.2,2.0*05 $BDGSA,A,3,08,13,28,33,38,42,,,,,,,2.3,1.2,2.0*2E $GPG…...

Navicat如何查看密码

近期遇到需要将大部分已存储的navicat数据库转发给其他人&#xff0c;于是乎进行导出文件 奈何对方不用navicat&#xff0c;无法进行文件的导入从而导入链接 搜罗navicat的密码查看&#xff0c;大部分都为php代码解析 以下转载GitHub上看到的一个python代码解析的脚本 这里是对…...

力扣143重排链表

143. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的…...

【GPT入门】第24课 langfuse介绍

【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…...

HarmonyOS NEXT个人开发经验总结

文章目录 1. 开发环境配置1.1 工具链安装流程1.2 环境配置代码 2. 项目架构设计2.1 分层架构图2.2 模块化配置 3. 核心开发实践3.1 声明式UI开发3.2 分布式数据管理 4. 性能优化策略4.1 性能优化流程图4.2 优化实践代码 5. 安全与权限管理5.1 权限申请流程5.2 安全存储示例 6. …...

Python基于深度学习的多模态人脸情绪识别研究与实现

一、系统架构设计 A[数据采集] --> B[预处理模块] B --> C[特征提取] C --> D[多模态融合] D --> E[情绪分类] E --> F[系统部署] F --> G[用户界面] 二、数据准备与处理 1. 数据收集 - 视频数据&#xff1a;FER2013&#xff08;静态图像&#xff0…...

golang快速上手基础语法

变量 第一种&#xff0c;指定变量类型&#xff0c;声明后若不赋值&#xff0c;使用默认值0 package mainimport "fmt"func main() {var a int //第一种&#xff0c;指定变量类型&#xff0c;声明后若不赋值&#xff0c;使用默认值0。fmt.Printf(" a %d\n"…...

【MySQL】多表操作 —— 外键约束

目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…...

⭐算法OJ⭐两数之和【哈希表】(C++ 实现)Two Sum

“两数之和”&#xff08;Two Sum&#xff09;是一道非常经典的算法题目&#xff0c;几乎是算法入门和面试准备的必做题之一。它的经典性体现在以下几个方面&#xff1a; 1. 算法入门的基础题目 这道题目是许多初学者接触 哈希表&#xff08;Hash Table&#xff09; 或 字典&…...

从被动响应到主动预见:智能可观测性技术的变革与实践

思维导图 一、引言 🌃 想象一下,在一个深夜 🌙,你的关键业务系统突然出现故障 🚨。传统情况下,你可能会收到大量不相关的告警 📱💬💬💬,然后花费数小时甚至数天时间 ⏳,在错综复杂的系统架构中寻找根本原因 🔍。而在智能可观测性的世界里,故障发生前系统…...

【GPT入门】第22课 langchain LCEL介绍

【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language&#xff0c;是 LangChain 推出的一种声明式语言&#xff0c;用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…...

LeetCode1005☞K次取反后最大的数组和

关联LeetCode题号1005 本题特点 贪心&#xff1a;局部最优解&#xff1a;将负数取反得到比原值大的值&#xff0c;进而全局最优解整体和为最大二次贪心: 如果取反次数大于负数个数&#xff0c;那么剩下次数如果为奇数&#xff0c;那么就将绝对值最小的数取反&#xff08;贪心…...

7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)

基于光线投射原理实现的体渲染 一、什么是体绘制&#xff1f;二、为什么不直接用3D模型渲染三、原理及部分代码解析1、什么是光线&#xff1f;2、什么是光线投射&#xff1f;3、为什么需要光线投射3D纹理&#xff1f;4、为什么必须是3D纹理&#xff1f;5、为什么还需要1D纹理&a…...

二、vtkCommand的使用

一、概述 vtkCommand是VTK中的一个重要的类&#xff0c;用于处理事件和回调机制。它允许用户在特定事件发生时执行自定义的操作&#xff0c;例如在交互操作、数据更新或渲染过程中触发某些功能。 二、主要功能 1、事件处理&#xff1a;vtkCommand用于监听和处理VTK管线中的各…...

Git的详细使用方法

Git 是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。以下是 Git 的详细使用方法&#xff1a; 1. 安装 Git Windows&#xff1a;从 Git 官网 下载安装包。 Linux&#xff08;Ubuntu/Debian&#xff09; sudo apt install git macOS&#xff1a; 使用 Homebr…...

在 Windows 上使用 choco 安装 mkcert 并配置 Vue 运行HTTPS

解决在Windows上使用Vue本地运行HTTPS的问题,vue-cli或vite都可以使用 步骤 1&#xff1a;确认 Chocolatey 是否已安装 1. 检查 choco 命令是否可用 打开 PowerShell&#xff08;管理员权限&#xff09;&#xff0c;输入&#xff1a; choco -v如果显示版本号&#xff08;如…...

spring声明式事务原理01-调用第1层@Transactional方法(事务访问入口)

文章目录 【README】【步骤1】UserAppService调用userSupport.saveNewUser()【步骤2】获取到TransactionInterceptor【步骤3】chain不为空&#xff0c;接着执行CglibMethodInvocation#proceed方法【补充】AopContext作用 【步骤4】CglibMethodInvocation#proceed方法【步骤5】调…...

Qt-D指针与Q指针的设计哲学

文章目录 前言PIMLP与二进制兼容性D指针Q指针优化d指针继承Q_D和Q_Q 前言 在探索Qt源码的过程中会看到类的成员有一个d指针&#xff0c;d指针类型是一个private的类&#xff0c;这种设计模式称为PIMPL&#xff08;pointer to implementation&#xff09;&#xff0c;本文根据Q…...

数据结构——单链表list

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍数据结构——单链表 目录 一、单链表 二、使用步骤 1.结构体定义 2.初始化 3.插入 3.1 头插 3.2 尾插 3.3 按位置插 四.删除 4.1头删 4.2 尾删 4.3 按位置删 4.4按值删 五 统计有效值个数 六 销毁…...

java 的标记接口RandomAccess使用方法

在 Java 中&#xff0c;RandomAccess 是一个标记接口&#xff08;marker interface&#xff09;&#xff0c;用于标识实现该接口的 List 实现类支持快速&#xff08;通常是常数时间复杂度 O(1)&#xff09;的随机访问。常见的实现类包括 ArrayList&#xff0c;而不包括 LinkedL…...

基于PHP的网店进销存管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 相比于以前的传统进销存管理方式&#xff0c;智能化的管理方式可以大幅降低进销存管理的运营人员成本&#xff0c;实现了进销存管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了商品信息及仓库信息的随意管理&#xff0c;提高了信息的处理速度和精确度&#…...

Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法

Vue3 Pinia $subscribe 可以用来监视Stroe数据的变化 localStorage的用法 localStorage中只能存字符串&#xff0c;所有对象要选转成json字符串 定义store时&#xff0c;从localStorage中读取数据talkList可能是字符串也可能是空数组 Store的组合式写法 直接使用reactiv…...

【PHP】获取PHP-FPM的状态信息

文章目录 一、前言二、环境三、过程1&#xff09;修改PHP-FPM配置文件2&#xff09;修改Nginx配置文件3&#xff09;访问页面4&#xff09;修改状态页面端口 一、前言 PHP-FPM内置有一个状态页面&#xff0c;通过这个页面可以获取到FPM的一些状态信息&#xff08;见下图&#…...

(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化

目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例&#xff1a;执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…...

Java 大视界 -- 基于 Java 的大数据实时流处理中的窗口操作与时间语义详解(135)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

数据库的基本知识

目录 一、创建数据库和数据表1.1 创建数据库相关代码1.2 创建数据表1.3 约束条件1.3.1 主键约束1.3.2 非空约束1.3.3 唯一性约束1.3.4 默认约束1.3.5 自增字段 1.4 手工建表 二、数据查询功能2.1 sql 查询的7个关键词2.1.1 select2.1.2 from2.1.3 where2.1.4 group by2.1.5 hav…...

失败的面试经历(ʘ̥∧ʘ̥)

一.面向对象的三大特性 1.封装&#xff1a;将对象内部的属性私有化&#xff0c;外部对象不能够直接访问&#xff0c;但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承&#xff1a;类与类之间会有一些相似之处&#xff0c;但也会有一些异处&#xff0c;使得他们与众…...

【Jmeter】使用教程

下载及安装 参考链接: JMeter下载及安装&#xff08;附插件及中文包超详细&#xff09; 参考链接: 【Jmeter】win 10 / win 11&#xff1a;Jmeter 下载、安装、汉化、新机迁移、版本更新&#xff08;Jmeter 4 以上版本均适用&#xff09; 分辨率的调整 参考链接: Jmeter5.3字…...