跳转至

03 fastLZ压缩解压缩

作者:沈园园 | 最后修改:2026-06-04

一、fastlz 介绍

fastlz 是一款高效且小巧的开源压缩库,主要用于实现基于 LZ77 算法的字节对齐数据压缩。

LZ77(Lempel-Ziv 1977)是数据压缩领域的一种基础方法,其核心思想是通过查找源数据中的重复模式来减少存储空间。

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

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

二、演示功能概述

演示 fastlz 的压缩与解压缩的使用方法,通过直接操作字符串和读取文件系统中的文件两种方式,来演示压缩与解压缩。

三、准备硬件环境

参考:硬件环境清单,准备以及组装好硬件环境。

购买链接:Air1601开发板 多功能5寸RGB屏 支持AirUI 摄像头 代开发固件-淘宝网

四、准备软件环境

4.1 软件环境

1.Luatools 工具

2.内核固件文件(底层 core 固件文件):

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

3.luatos 需要的脚本和资源文件

  • 脚本和资源文件点击此处查看与下载

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

4.准备好软件环境之后,接下来查看如何烧录项目文件到 Air1601 开发板中,将本篇文章中演示使用的项目文件烧录到Air1601开发板 中。

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)

七、运行结果展示

八、总结

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