跳转至

15 miniz压缩解压缩

作者:沈园园

一、MINIZ 解压工具简介

miniz是一个单一文件的小型压缩库,它是zlib的一个替代品,专门为需要轻量级压缩解决方案的项目设计,它被设计成可以轻松地集成到项目中,并且具有最小的依赖性。

miniz的主要特点包括:

  1. 支持zlib兼容的压缩和解压缩。
  2. 单个源文件实现,易于集成。
  3. 小的内存占用,适合资源受限的环境。
  4. 支持流式压缩和解压缩。 注意:如果数据本身只有几十个字节,压缩后可能更大,而非更小。

二、演示功能概述

演示miniz的压缩与解压缩的使用方法。

三、准备硬件环境

1、Air780EHV核心板一块

2、TYPE-C USB数据线一根

3、Air780EHV核心板和数据线的硬件接线方式为

  • Air780EHV核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
  • 核心板正面的 ON/OFF 拨动开关 拨到ON一端;

四、准备软件环境

4.1 软件环境

在开始实践本示例之前,先筹备一下软件环境:

1、烧录工具:Luatools 下载调试工具

2、内核固件:本demo开发测试时使用的固件为LuatOS-SoC_V2032_Air780EHV,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EHM_Air780EHV_Air780EGH/demo/miniz

4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件

准备好软件环境之后,接下来查看如何烧录项目文件到Air780EHV核心板,将本篇文章中演示使用的项目文件烧录到780EHV核心板中。

4.2 API 介绍

miniz 库:https://docs.openluat.com/osapi/core/miniz/

五、程序结构

miniz/
│── main.lua
│── miniz_app.lua
│── readme.md

5.1 文件说明

  1. main.lua:主程序入口文件。
  2. miniz_app.lua:miniz的压缩与解压缩的使用方法。

六、代码详解

6.1 main.lua

主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。

6.2 miniz_app.lua

miniz的压缩与解压缩的使用方法。

6.2.1 压缩与解压

local function miniz_task_func()
    -- 压缩过的字符串, 为了方便演示, 这里用了base64编码
    -- miniz能解压标准zlib数据流
    -- 将字符串进行base64解码
    local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
    local str = b64str:fromBase64()
    -- 快速解压
    local dstr = miniz.uncompress(str) 
    -- 压缩过的数据长度 156
    -- 解压后的数据长度,即原始数据的长度 235
    log.info("miniz", "压缩过的数据长度: ", #str, "解压后的数据长度:", #dstr)    

    -- 演示压缩解压
    local ostr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
    log.info("压缩前的字符串:", #ostr, ostr)
    -- 压缩字符串
    local zstr = miniz.compress(ostr)
    log.info("压缩后的字符串:",#zstr, zstr:toHex())
    -- 解压字符串
    local lstr = miniz.uncompress(zstr)
    log.info("解压后的字符串:", #lstr, lstr)

    -- 演示从文件读取2K数据压缩
    local ostr = io.readFile("/luadb/test.txt")
    local zstr = miniz.compress(ostr)
    if zstr then
        log.info("miniz", "压缩前的数据长度: ", #ostr, "压缩后的数据长度: ", #zstr) 
    end  
end


--创建一个task,并且运行task的主函数miniz_task_func
sys.taskInit(miniz_task_func)

七、运行结果展示

出现类似于下面的日志,就表示运行成功:

[2025-10-28 11:39:11.816][000000000.379] I/user.miniz 压缩过的数据长度:  156 解压后的数据长度: 235
[2025-10-28 11:39:11.821][000000000.380] I/user.压缩前的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
[2025-10-28 11:39:11.826][000000000.383] I/user.压缩后的字符串: 92 780105C0040D80B04A383CCEDDDD9F9E4184C97E9CD7FDBC1FD828E3422A6DACF321A65C6AEB632E8830D98FF3BA9FF7031B655C48A58D753EC4944B6D7DCC051126FB715EF7F37E60A38C0BA9B4B1CE879872A9AD8FB97E17A42785 184
[2025-10-28 11:39:11.832][000000000.383] I/user.解压后的字符串: 108 abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz
[2025-10-28 11:39:11.836][000000000.389] I/user.miniz 压缩前的数据长度:  2048 压缩后的数据长度:  1350

八、总结

通过本文学习,你可以学习到miniz的压缩与解压缩的使用方法。