目錄
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 的對比
特性 | miniz | ZLIB |
---|---|---|
體積 | 極小(單文件) | 中等(多文件) |
依賴 | 無 | 無(但通常作為系統庫存在) |
性能 | 良好 | 優秀 |
兼容性 | 兼容 ZLIB 格式 | 標準實現 |
功能 | 基礎壓縮 / 解壓縮、ZIP 基礎功能 | 完整的壓縮 / 解壓縮功能 |
適用場景 | 嵌入式、輕量級應用 | 通用場景、系統級應用 |
5.使用場景
- 嵌入式系統中的數據壓縮
- 游戲開發中的資源打包 / 解包
- 需要輕量級壓縮方案的應用程序
- 替代系統 ZLIB 庫以減少依賴
- 內存受限環境下的壓縮需求
6.注意事項
- 對于非常大的文件,建議使用流式處理接口
- 壓縮級別越高,壓縮率越好,但速度越慢
- 在資源受限的環境中,可通過宏定義裁剪不需要的功能
- 雖然兼容 ZLIB 格式,但在極高性能要求的場景下,可能仍需考慮使用系統 ZLIB 庫
miniz 以其輕量級設計和良好的兼容性,成為需要嵌入式壓縮功能場景的理想選擇。它的 API 設計與 ZLIB 相似,熟悉 ZLIB 的開發者可以快速上手。