跳转至

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 文件说明

  1. main.lua:主程序入口文件。
  2. 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 的压缩与解压缩的使用方法。