20 fastLZ压缩解压缩
作者:沈园园 | 最后修改:2026-04-09
一、fastlz 介绍
Air780EPM只有8号固件支持此功能;Air780EHM的11号、12号、111号、112号固件不支持此功能。
fastlz 是一款高效且小巧的开源压缩库,主要用于实现基于 LZ77 算法的字节对齐数据压缩。
LZ77(Lempel-Ziv 1977)是数据压缩领域的一种基础方法,其核心思想是通过查找源数据中的重复模式来减少存储空间。
适用于压缩文本/段落序列、原始像素数据序列或具有大量重复的任何其他数据块。但是不打算用于图像、视频和其他通常已经以最佳压缩形式存在的格式的数据。
fastlz 的重点是非常快速的压缩和解压缩。
二、演示功能概述
演示 fastlz 的压缩与解压缩的使用方法,通过直接操作字符串和读取文件系统中的文件两种方式,来演示压缩与解压缩。
三、准备硬件环境

1、Air780EHM核心板一块
2、TYPE-C USB数据线一根
3、Air780EHM核心板和数据线的硬件接线方式为
- Air780EHM核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
- 核心板正面的 ON/OFF 拨动开关 拨到ON一端;
四、准备软件环境
4.1 软件环境
在开始实践本示例之前,先筹备一下软件环境:
1、烧录工具:Luatools 下载调试工具
2、本demo开发测试时使用的固件为LuatOS-SoC_V2028_Air780EPM,(请选择支持 fastlz 功能固件),所以你如果要测试本demo时,可以直接使用支持 fastlz 功能最新版本的内核固件Air780EPM固件,Air780EHM固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EHM_Air780EHV_Air780EGH/demo/fastlz
4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EHM核心板,将本篇文章中演示使用的项目文件烧录到Air780EHM核心板中。
4.2 API 介绍
fastlz 库:https://docs.openluat.com/osapi/core/fastlz/
五、程序结构
miniz/
│── main.lua
│── fastlz_app.lua
│── readme.md
5.1 文件说明
main.lua:主程序入口文件。fastlz_app.lua:fastlz 的压缩与解压缩的使用方法。
六、代码详解
6.1 main.lua
主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。
6.2 fastlz_app.lua
fastlz 的压缩与解压缩的使用方法。
6.2.1 压缩与解压
function fastlz_compress_uncompress_func(mode)
-- 原始数据
local originStr
if mode == 1 then
log.info("原始数据文件读取2K数据")
originStr = io.readFile("/luadb/test.txt")
else
log.info("原始数据108长度字符串")
originStr = "abcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyzabcd1234567890efghijklmnopqrstuvwxyz"
end
local maxOut = #originStr
log.info("原始数据长度", #originStr)
-- 以压缩等级1 进行压缩
local L1 = fastlz.compress(originStr,1)
log.info("压缩等级1:压缩后的数据长度", #L1)
-- 解压
local dstr1 = fastlz.uncompress(L1,maxOut)
log.info("压缩等级1:解压后的的数据长度", #dstr1)
-- 判断解压后的数据是否与原始数据相同
if originStr == dstr1 then
log.info("压缩等级1:解压后的数据与原始数据相同")
else
log.info("压缩等级1:解压后的数据与原始数据不同")
end
-- 以压缩等级2 进行压缩
local L2 = fastlz.compress(originStr, 2)
log.info("压缩等级2:压缩后的数据长度", #L2)
-- 解压
local dstr2 = fastlz.uncompress(L2,maxOut)
log.info("压缩等级2:解压后的数据长度", #dstr2)
-- 判断解压后的数据是否与原始数据相同
if originStr == dstr2 then
log.info("压缩等级2:解压后的数据与原始数据相同")
else
log.info("压缩等级2:解压后的数据与原始数据不同")
end
end
function fastlz_task_func()
-- 原始数据108长度字符串
fastlz_compress_uncompress_func()
-- 原始数据文件读取2K数据
fastlz_compress_uncompress_func(1)
end
--创建一个task,并且运行task的主函数fastlz_task_func
sys.taskInit(fastlz_task_func)
七、运行结果展示
出现类似于下面的日志,就表示运行成功:
[2025-10-28 17:11:11.613][000000000.368] I/user.原始数据108长度字符串
[2025-10-28 17:11:11.613][000000000.369] I/user.原始数据长度 108
[2025-10-28 17:11:11.623][000000000.370] I/user.压缩等级1:压缩后的数据长度 47
[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的的数据长度 108
[2025-10-28 17:11:11.623][000000000.371] I/user.压缩等级1:解压后的数据与原始数据相同
[2025-10-28 17:11:11.623][000000000.373] I/user.压缩等级2:压缩后的数据长度 47
[2025-10-28 17:11:11.633][000000000.374] I/user.压缩等级2:解压后的数据长度 108
[2025-10-28 17:11:11.637][000000000.374] I/user.压缩等级2:解压后的数据与原始数据相同
[2025-10-28 17:11:11.637][000000000.374] I/user.原始数据文件读取2K数据
[2025-10-28 17:11:11.643][000000000.375] I/user.原始数据长度 2048
[2025-10-28 17:11:11.643][000000000.377] I/user.压缩等级1:压缩后的数据长度 128
[2025-10-28 17:11:11.643][000000000.378] I/user.压缩等级1:解压后的的数据长度 2048
[2025-10-28 17:11:11.653][000000000.378] I/user.压缩等级1:解压后的数据与原始数据相同
[2025-10-28 17:11:11.653][000000000.379] I/user.压缩等级2:压缩后的数据长度 116
[2025-10-28 17:11:11.693][000000000.380] I/user.压缩等级2:解压后的数据长度 2048
[2025-10-28 17:11:11.713][000000000.380] I/user.压缩等级2:解压后的数据与原始数据相同
八、总结
通过本文学习,你可以学习到fastlz 的压缩与解压缩的使用方法。