跳转至

压缩解压缩

一、FastLZ 概述

1.1 FastLZ 是什么

FastLZ 是一个基于 ANSI C/C90 的小型、可移植的无损数据压缩库,实现了 LZ77 算法。它特别适合压缩文本、段落、原始像素数据序列或任何具有大量重复数据块的数据。FastLZ 的设计重点在于快速压缩和解压缩,以牺牲压缩比为代价。它由 ariya 编写,并在 MIT 许可下发布。

1.2 FastLZ 的使用

FastLZ 的使用非常简单,只包含两个文件:FastLZ.hFastLZ.c,可以直接集成到任何 C/C++ 应用程序中。它支持多种体系结构,包括 Intel/AMD、ARM 和 MIPS 等,无论是 32 位还是 64 位,大端或小端都能良好工作。

在 LuatOS 中,用户只需调用“压缩/解压缩接口”即可实现数据的压缩与解压缩。

二、演示功能概述

本章节用一个示例演示 Air8101 中 FastLZ 的 压缩与解压缩 功能

三、准备硬件环境

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

参考:硬件环境清单 - luatos@air8101 - 合宙文档中心,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;参考项目使用的内核固件;

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

脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/fastlz

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

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板 - luatos@air8101 - 合宙文档中心,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。

五、FastLZ 软硬件资料

5.1 API 接口介绍

本教程使用 api 接口为:等待补充......

六、代码示例介绍

6.1 压缩与解压缩

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

sys = require("sys")

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

sys.taskInit(function()
    sys.wait(1000)

    -- 原始数据
    local originStr = io.readFile("/luadb/fastlz.h") or "q309pura;dsnf;asdouyf89q03fonaewofhaeop;fhiqp02398ryhai;ofinap983fyua0weo;ifhj3p908fhaes;iofaw789prhfaeiwop;fhaesp98fadsjklfhasklfsjask;flhadsfk"
    log.info("原始数据长度", #originStr)

    -- 以压缩等级1 进行压缩
    local L1 = fastlz.compress(originStr)
    log.info("压缩等级1:压缩后的数据长度", #L1)

    -- 解压
    local dstr1 = fastlz.uncompress(L1)
    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)
    log.info("压缩等级2:解压后的数据长度", #dstr2)

    -- 判断解压后的数据是否与原始数据相同
    if originStr == dstr2 then
        log.info("压缩等级2:解压后的数据与原始数据相同")
    else
        log.info("压缩等级2:解压后的数据与原始数据不同")
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

七、总结

本教程旨在通过合宙开发板展示 FastLZ 压缩与解压缩的实现方法。