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
英文地址,請注明出處:http://en.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;打造了完善的從芯…