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 #include #include #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;}// 添加内存中的数据到ZIPconst 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 的对比
5.使用场景
- 嵌入式系统中的数据压缩
- 游戏开发中的资源打包 / 解包
- 需要轻量级压缩方案的应用程序
- 替代系统 ZLIB 库以减少依赖
- 内存受限环境下的压缩需求
6.注意事项
- 对于非常大的文件,建议使用流式处理接口
- 压缩级别越高,压缩率越好,但速度越慢
- 在资源受限的环境中,可通过宏定义裁剪不需要的功能
- 虽然兼容 ZLIB 格式,但在极高性能要求的场景下,可能仍需考虑使用系统 ZLIB 库
miniz 以其轻量级设计和良好的兼容性,成为需要嵌入式压缩功能场景的理想选择。它的 API 设计与 ZLIB 相似,熟悉 ZLIB 的开发者可以快速上手。