miniz:一个轻量级、高性能的开源压缩库

目录

1.简介

 2.核心特性

3.基本使用示例

4.与 ZLIB 的对比

5.使用场景

6.注意事项


1.简介

       miniz 是一个轻量级、高性能的开源压缩库,专注于提供 ZLIB/GZIP 兼容的压缩和解压缩功能。它的核心优势在于体积小巧(单文件实现)、跨平台支持和零依赖,非常适合嵌入到各种应用程序中。       

        miniz的核心在于其简洁性和灵活性。它以单个源文件的形式发布,方便集成到任何项目中。通过CMake或Meson模块支持构建,兼容多种编译器,如GCC、Clang和Visual Studio。Miniz不仅适用于桌面应用程序开发,也适合嵌入式系统和移动平台。

        获取与安装:

1.官方仓库:https://github.com/richgel999/miniz

2.集成方法:

  • 直接将 miniz.c 和 miniz.h 复制到项目中
  • 在代码中包含 #include "miniz.h"
  • 编译时将 miniz.c 一起编译

 2.核心特性

1.轻量级设计

  • 仅包含两个文件:miniz.c 和 miniz.h,易于集成到项目中
  • 无外部依赖,不依赖系统 ZLIB 库
  • 编译后体积小(约 50KB-100KB,取决于功能配置)

2.功能完整

  • 支持 DEFLATE 压缩算法(ZLIB 标准)
  • 兼容 ZLIB 格式(RFC 1950)和 GZIP 格式(RFC 1952)
  • 支持原始 DEFLATE 数据流(无头部 / 尾部)
  • 提供压缩级别控制(1-9 级,1 最快,9 压缩率最高)

3.跨平台支持

  • 兼容 Windows、Linux、macOS 等主流操作系统
  • 支持 x86、x64、ARM 等架构
  • 可在嵌入式系统中使用(资源占用低)

4.额外功能

  • 内存中压缩 / 解压缩(无需文件操作)
  • 支持流式处理(适合大文件)
  • 提供 CRC32 校验功能
  • 支持 ZIP 归档创建和读取(基础功能)

3.基本使用示例

以下是 miniz 库的基本使用示例,展示压缩和解压缩功能:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "miniz.h"// 压缩函数
size_t compress_data(const unsigned char *p_src, size_t src_len, unsigned char *p_dst, size_t dst_capacity, int level) {z_stream zs;memset(&zs, 0, sizeof(zs));// 初始化压缩流int ret = deflateInit(&zs, level);if (ret != Z_OK) {printf("压缩初始化失败: %d\n", ret);return 0;}zs.next_in = (Bytef*)p_src;zs.avail_in = src_len;zs.next_out = (Bytef*)p_dst;zs.avail_out = dst_capacity;// 执行压缩ret = deflate(&zs, Z_FINISH);if (ret != Z_STREAM_END) {deflateEnd(&zs);printf("压缩失败: %d\n", ret);return 0;}size_t compressed_size = zs.total_out;// 释放资源deflateEnd(&zs);return compressed_size;
}// 解压缩函数
size_t decompress_data(const unsigned char *p_src, size_t src_len,unsigned char *p_dst, size_t dst_capacity) {z_stream zs;memset(&zs, 0, sizeof(zs));// 初始化解压缩流int ret = inflateInit(&zs);if (ret != Z_OK) {printf("解压缩初始化失败: %d\n", ret);return 0;}zs.next_in = (Bytef*)p_src;zs.avail_in = src_len;zs.next_out = (Bytef*)p_dst;zs.avail_out = dst_capacity;// 执行解压缩ret = inflate(&zs, Z_FINISH);if (ret != Z_STREAM_END) {inflateEnd(&zs);printf("解压缩失败: %d\n", ret);return 0;}size_t decompressed_size = zs.total_out;// 释放资源inflateEnd(&zs);return decompressed_size;
}int main() {// 原始数据const char *original_data = "这是一段用于测试miniz库压缩功能的文本数据,""miniz是一个轻量级的压缩库,支持ZLIB/GZIP格式。";size_t original_size = strlen(original_data) + 1; // +1 包含终止符// 分配压缩缓冲区(通常为原始数据的1.5倍大小)size_t compress_buf_size = original_size * 2;unsigned char *compressed_data = (unsigned char*)malloc(compress_buf_size);if (!compressed_data) {printf("内存分配失败\n");return 1;}// 压缩数据(使用最高压缩级别9)size_t compressed_size = compress_data((const unsigned char*)original_data, original_size,compressed_data, compress_buf_size, 9);if (compressed_size == 0) {free(compressed_data);return 1;}printf("原始大小: %zu 字节\n", original_size);printf("压缩后大小: %zu 字节\n", compressed_size);printf("压缩率: %.2f%%\n", (float)compressed_size / original_size * 100);// 分配解压缩缓冲区unsigned char *decompressed_data = (unsigned char*)malloc(original_size);if (!decompressed_data) {printf("内存分配失败\n");free(compressed_data);return 1;}// 解压缩数据size_t decompressed_size = decompress_data(compressed_data, compressed_size,decompressed_data, original_size);if (decompressed_size == 0) {free(compressed_data);free(decompressed_data);return 1;}// 验证解压缩结果if (memcmp(original_data, decompressed_data, original_size) == 0) {printf("解压缩成功,数据一致\n");// printf("解压缩内容: %s\n", decompressed_data);} else {printf("解压缩失败,数据不一致\n");}// 释放资源free(compressed_data);free(decompressed_data);return 0;
}

ZIP 文件操作示例

miniz 还提供了基本的 ZIP 文件操作功能:

// 创建ZIP文件并添加内容
mz_zip_archive zip_archive;
memset(&zip_archive, 0, sizeof(zip_archive));// 初始化ZIP归档
if (!mz_zip_writer_init_file(&zip_archive, "example.zip", 0)) {printf("无法创建ZIP文件\n");return 1;
}// 添加内存中的数据到ZIP
const char *file_content = "这是ZIP中的文件内容";
if (!mz_zip_writer_add_mem(&zip_archive, "test.txt", file_content, strlen(file_content), MZ_DEFAULT_COMPRESSION)) {printf("无法添加文件到ZIP\n");mz_zip_writer_end(&zip_archive);return 1;
}// 完成ZIP文件创建
mz_zip_writer_end(&zip_archive);

4.与 ZLIB 的对比

特性minizZLIB
体积极小(单文件)中等(多文件)
依赖无(但通常作为系统库存在)
性能良好优秀
兼容性兼容 ZLIB 格式标准实现
功能基础压缩 / 解压缩、ZIP 基础功能完整的压缩 / 解压缩功能
适用场景嵌入式、轻量级应用通用场景、系统级应用

5.使用场景

  • 嵌入式系统中的数据压缩
  • 游戏开发中的资源打包 / 解包
  • 需要轻量级压缩方案的应用程序
  • 替代系统 ZLIB 库以减少依赖
  • 内存受限环境下的压缩需求

6.注意事项

  1. 对于非常大的文件,建议使用流式处理接口
  2. 压缩级别越高,压缩率越好,但速度越慢
  3. 在资源受限的环境中,可通过宏定义裁剪不需要的功能
  4. 虽然兼容 ZLIB 格式,但在极高性能要求的场景下,可能仍需考虑使用系统 ZLIB 库

miniz 以其轻量级设计和良好的兼容性,成为需要嵌入式压缩功能场景的理想选择。它的 API 设计与 ZLIB 相似,熟悉 ZLIB 的开发者可以快速上手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90717.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins接口自动化测试(构建)平台搭建

Python接口自动化测试零基础入门到精通&#xff08;2025最新版&#xff09;自动化测试流程 在进行平台搭建前&#xff0c;我们首先要问自己&#xff1a;我需要搭建的平台的功能是什么&#xff0c;要实现什么目标&#xff1f; 在我的理解中&#xff0c;自动化构建平台的执行流…

Day 22: 复习

机器学习数据处理与降维技术复习总结 前言 经过6天的学习&#xff0c;我们系统地学习了从基础的Numpy数组操作到高级的降维算法&#xff0c;这些内容构成了机器学习数据预处理的重要知识体系。本文将对这一系列学习内容进行全面复习和总结&#xff0c;帮助大家建立完整的知识…

力扣 hot100 Day56

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 编码规范全指南

在 Android 开发领域&#xff0c;代码不仅是功能实现的载体&#xff0c;更是团队协作与项目迭代的基础。一套完善的编码规范&#xff0c;能让代码从 “可运行” 升级为 “易维护、可扩展、低风险”。本文基于 Google、Square 等顶尖团队的实践经验&#xff0c;结合国内 Android…

[RPA] Excel中的字典处理

案例1一个Excel文件总共有2个Sheet页&#xff0c;分别为总表和对照表通过对照表sheet页&#xff0c;设置价格对照字典对照表循环总表sheet页&#xff0c;根据循环到的商品名称&#xff0c;找到对应字典中的价格&#xff0c;并计算出总价总表将总价写入到Excel表中C列&#xff0…

基于NSGAII优化算法的车间生产调度matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.参考文献 6.完整程序 1.程序功能描述 车间生产调度是制造业的核心环节&#xff0c;其目标是在满足设备约束、工序优先级等条件下&#xff0c;优化多个相互冲突的生产指标&#xff08;如…

Cmake、VS2019、C++、openGLopenCV环境安装

在 CMake 和 Visual Studio 2019 环境下安装和配置 OpenGL、OpenCV 以及 CUDA 可能会有些复杂&#xff0c;因为涉及的组件多且相互依赖。以下是一个详细的指南&#xff0c;帮助您逐步完成安装和配置。 1. 前提条件 在开始之前&#xff0c;请确保您已安装以下软件&#xff1a; …

视频二维码在产品设备说明书中的应用

在当今数字化的时代&#xff0c;传统的产品设备说明书正面临着一场变革。文字和图片虽然能提供基本信息&#xff0c;但在复杂设备的安装、操作和故障排除方面&#xff0c;往往显得力不从心。而视频二维码的出现&#xff0c;为这一困境提供了完美的解决方案&#xff0c;它将冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全实战手册 一、核心概念与基础 1、在pytest框架下运行测试用例&#xff0c;最基础的一共有三点。导入pytest的包写一个方法&#xff0c;或者类。后面运行的时候&#xff0c;相当于运行这个方法&#xff0c;或者类里的方法&#xff0c;无需…

基于OpenOCD 的 STM32CubeIDE 开发烧录调试环境搭建 DAPLINK/STLINK

需要部署一个开发环境,实现h7的板子通过daplink功能给目标板烧写程序(同事要将这个过程用fpga实现),需要通过openocd+gdb+daplink stm32; 总结:单条命令执行太麻烦,参考4写成脚本文件: 独立脚本使用Openocd ​ 在**“在Stm32CubeIDE环境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee无线串口通信问题

使用 ZigBee 进行无线串口通信时&#xff0c;接收异常&#xff08;如丢包、乱码、完全无法接收&#xff09;是常见问题&#xff0c;其原因涉及射频通信特性、网络机制、硬件配置、环境干扰等多个层面。以下从具体机制出发&#xff0c;详细分析可能的原因&#xff1a;一、射频层…

【AI周报】2025年7月26日

【AI周报】2025年7月第四周观察&#xff1a;GitHub Spark重塑开发范式&#xff0c;中美AI政策对垒升级 省流版静态页面周报&#xff0c;为方便各位看官快速食用&#xff0c;我准备了摘要版周报&#xff0c;欢迎访问&#xff1a;20250726周报 引言&#xff1a;本周焦点速览 2…

HTML:从 “小白” 到 “标签侠” 的修炼手册

目录 一、HTML&#xff1a;网页的 “骨架” 不是骷髅架 二、文本标签&#xff1a;文字的 “华丽变身” 术 1. 标题标签&#xff1a;文字界的 “领导班子” 2. 段落标签&#xff1a;文字的 “专属保姆” 3. 文本格式化标签&#xff1a;给文字 “穿花衣” 三、链接标签&…

python3GUI--基于YOLO的火焰与烟雾检测系统By:PyQt5(详细图文介绍)

文章目录一&#xff0e;前言1.引言2.正文二&#xff0e;核心内容1.数据集2.模型训练3.界面窗口1.登录注册界面2.核心功能界面3.检测告警提示窗口三&#xff0e;.核心界面模块介绍1.顶部信息区域2.数据输入3.参数配置4.告警设置5.操作台6.关于7.指标变化8.异常速览9.日志输出10.…

基于Transform、ARIMA、LSTM、Prophet的药品销量预测分析

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、数据准备与预处理三、模型选择与方法设计1. ARIMA 模型&#xff1a;传统统计方法的基线构建2. LSTM 模型&#xff1a;引入记忆机制的深度学习方法3. Transformer 模型&#…

LLM隐藏层与logits数值的简单理解

LLM的“隐藏层数值”和“logits数值” 代表什么,范围是多少 “隐藏层数值”和“logits数值”是两个关键概念——它们分别对应模型“理解信息”和“输出决策”的核心环节。 一、先明确基础:LLM的“思考”流程 LLM本质是“输入文本→处理信息→输出结果”的神经网络。简单说…

Vue》》@ 用法

使用 别名导入 // 导入 src/components/Button.vue import Button from /components/Button.vue// 导入 src/utils/helper.js import { helperFunc } from /utils/helper// 导入 src/store/index.js import store from /store

20250726-1-Kubernetes 网络-Service存在的意义_笔记

一、Service控制器 1. Service存在的意义 1)基本场景  动态IP问题:Pod IP具有短暂性,销毁重建后IP会变化(示例:原IP 169.130重建后变为169.132) 服务发现需求:需要稳定入口访问同一服务的多个Pod,避免因Pod变动导致服务中断 负载均衡需求:多个Pod副本需要统一访…

在一个存在的包里面编写msg消息文件

前言尽管最佳实践是在专门的接口包中声明接口&#xff0c;但有时在同一个包中完成接口的声明、创建和使用会更为便捷。创建文件创建好msg/AddressBook.msg文件&#xff0c;在你的包的目录下package.xml<buildtool_depend>rosidl_default_generators</buildtool_depend…

华为服务器操作系统openEuler介绍与安装

一、openEuler概述 1.1、openEuler介绍 openEuler&#xff08;简称 “欧拉”&#xff09;是华为开源的服务器操作系统&#xff0c;是基于Linux稳定系统内核的、面向企业级的通用服务器架构平台。能够满足客户从传统IT基础设施到云计算服务的需求&#xff0c;打造了完善的从芯…