跳转至

fastLZ压缩(Air780EPM不支持)

一、演示功能概述

1.1 FastLZ 介绍

FastLZ 是一款高效且小巧的开源压缩库,主要用于实现基于 LZ77 算法的字节对齐数据压缩。LZ77(Lempel-Ziv 1977)是数据压缩领域的一种基础方法,其核心思想是通过查找源数据中的重复模式来减少存储空间。

适用于压缩文本/段落序列、原始像素数据序列或具有大量重复的任何其他数据块。但是不打算用于图像、视频和其他通常已经以最佳压缩形式存在的格式的数据。

FastLZ 的重点是非常快速的压缩和解压缩。

1.2 教程概述

本教程将使用 Air780EHM 核心板,演示 FastLZ 的压缩与解压缩的使用方法,实现读取文件系统中的文件,并演示压缩与解压缩的代码实现。

二、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

准备一块 Air780EHM 核心板:点击购买

三、准备软件环境

烧录工具:Luatools 工具

Air780EPM 烧录需要的固件和脚本文件:

LuatOS 运行所需要的 lib 文件:

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

四、软硬件资料

4.1 API 接口介绍

13 fastlz - 合宙模组资料中心

五、代码示例介绍

5.1 代码介绍

--[[
@module  main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date    2025.07.01
@author  孟伟
@usage
本demo演示的功能为:
实现使用Air780EHM来对文本/段落序列、原始像素数据序列或具有大量重复的任何其他数据块的快速压缩与解压缩。
]]
--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
        可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可

]]
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "FastLZ"
VERSION = "001.000.000"

--添加硬狗防止程序卡死
if wdt then
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
--     errDump.config(true, 600)
-- end

-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
-- 可以使用合宙的iot.openluat.com平台进行远程升级
-- 也可以使用客户自己搭建的平台进行远程升级
-- 远程升级的详细用法,可以参考fota的demo进行使用

-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
--     log.info("mem.lua", rtos.meminfo())
--     log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)

--加载fastlz测试应用模块
require "fastlz_test"

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
--[[
@module  fastlz_test
@summary fastlz压缩与解压缩测试功能模块
@version 1.0
@date    2025.07.01
@author  孟伟
@usage
使用Air780EHM演示压缩与解压缩的流程。
]]

function test_fastlz_func()
    sys.wait(1000)
    -- 原始数据
    local originStr = io.readFile("/luadb/test.txt") or "q309pura;dsnf;asdouyf89q03fonaewofhaeop;fhiqp02398ryhai;ofinap983fyua0weo;ifhj3p908fhaes;iofaw789prhfaeiwop;fhaesp98fadsjklfhasklfsjask;flhadsfk"
    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

    sys.wait(1000)

    -- 以压缩等级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
--创建并且启动一个task
--运行这个task的主函数test_fastlz_func
sys.taskInit(test_fastlz_func)

5.2 功能测试

可以通过日志看到,原始数据长度是 3456 字节,经过 fastlz 压缩后长度是 2170 字节,经过压缩节省了 1286 字节空间,将压缩后的字符串经过解压后长度和原来保持不变,并且通过打印日志前面的时间可以看出 fastlz 压缩与解压缩的速度都是很快的。

六、总结

至此,我们已经用 Air780EHM 核心板演示了 fastLZ 功能,演示了压缩与解压缩的过程。