zlib解压
一、ZLIB 解压工具简介
Zlib 解压工具是一个广泛使用的压缩和解压缩库,主要用于处理数据的压缩和解压缩任务。Zlib 使用的是 DEFLATE 算法,这是一种通用的压缩算法。它被应用在很多场景中,比如压缩文件、网络传输中的数据压缩、以及各种应用程序中的数据存储和读取。
Zlib 的代码库相对小巧,因此在嵌入式系统和资源受限的环境中也能很好地使用。
详细细节可以参考:https://www.cnblogs.com/LyShark/p/17861293.html
二、演示功能概述
演示如何对数据压缩解压。
三、准备硬件环境
3.1 Air700ECQ 开发板
使用 Air700ECQ 开发板,如下图所示:
淘宝购买链接:Air700ECQ 开发板淘宝购买链接 ;
此开发板的详细使用说明参考:Air700ECQ 产品手册 中的 《开发板EVB-Air700ECQ-IO使用手册VX.X.X.pdf》,写这篇文章时最新版本的使用说明为:开发板EVB-Air700ECQ-IO使用手册V1.0.0.pdf ;开发板使用过程中遇到任何问题,可以直接参考这份使用说明 pdf 文档。
3.2 数据通信线
typec 接口 USB 数据线即可。
3.3 PC 电脑
WIN10以及以上版本的WINDOWS系统。
四、准备软件环境
4.1 基本的下载调试工具
使用说明参考:Luatools 下载和详细使用 ;
五、ZLIB 解压操作软硬件资料
5.1 文档和工具:
- Air700ECQ 模块使用固件:SDK& Demo - 合宙文档中心,本 demo 使用的固件版本是:LuatOS-SoC_V2001_Air700ECQ.soc
- 本教程使用的 demo:https://gitee.com/openLuat/LuatOS-Air700ECQ/tree/master/demo/miniz
- 将固件和脚本烧录到模块中:Luatools 下载和使用教程 - 合宙模组资料中心
- 源码和固件已打包,如下所示: 点我,下载完整压缩文件包
- zlib-全部api地址,如果只看本demo的api直接看下面的
5.2 demo使用api介绍
即可。
5.2 demo使用api介绍
使用常量
常量 | 类型 | 解释 |
---|---|---|
miniz.WRITE_ZLIB_HEADER | int | 压缩参数, 是否写入 zlib 头部数据, compress 函数的默认值 |
miniz.COMPUTE_ADLER32 | int | 压缩/解压参数, 是否计算/校验 adler-32 |
miniz.GREEDY_PARSING_FLAG | int | 压缩参数, 是否快速 greedy 处理, 默认使用较慢的处理模式 |
miniz.NONDETERMINISTIC_PARSING_FLAG | int | 压缩参数, 是否快速初始化压缩器 |
miniz.RLE_MATCHES | int | 压缩参数, 仅扫描 RLE |
miniz.FILTER_MATCHES | int | 压缩参数, 过滤少于 5 次的字符 |
miniz.FORCE_ALL_STATIC_BLOCKS | int | 压缩参数, 是否禁用优化过的 Huffman 表 |
miniz.FORCE_ALL_RAW_BLOCKS | int | 压缩参数, 是否只要 raw 块 |
miniz.PARSE_ZLIB_HEADER | int | 解压参数, 是否处理 zlib 头部, uncompress 函数的默认值 |
miniz.HAS_MORE_INPUT | int | 解压参数, 是否还有更多数据, 仅流式解压可用, 暂不支持 |
miniz.USING_NON_WRAPPING_OUTPUT_BUF | int | 解压参数, 解压区间是否够全部数据, 仅流式解压可用, 暂不支持 |
miniz.COMPUTE_ADLER32 | int | 解压参数, 是否强制校验 adler-32 |
miniz.compress(data, flags)
作用:快速压缩,需要 165KB 的系统内存和 32KB 的 LuaVM 内存
参数
参数 | 传入值类型 | 解释 |
---|---|---|
data | string | 待压缩的数据,少于 400 字节的数据不建议压缩,且压缩后的数据不能大于 32KB |
flags | flags | 压缩参数,默认是 miniz.WRITE_ZLIB_HEADER,即写入 zlib 头部 |
返回值
返回值类型 | 解释 |
---|---|
string | 若压缩成功,返回数据字符串,否则返回 nil |
string.fromBase64(str)
作用:将字符串进行 base64 解码
参数
参数 | 传入值类型 | 解释 |
---|---|---|
str | string | 需要转换的字符串 |
返回值
返回值类型 | 解释 |
---|---|
string | 解码后的字符串,若解码失败则返回空字符串 |
miniz.uncompress(data, flags)
作用:快速解压,需要 32KB 的 LuaVM 内存
参数
参数 | 传入值类型 | 解释 |
---|---|---|
data | string | 待解压的数据,解压后的数据不能大于 32KB |
flags | flags | 解压参数,默认是 miniz.PARSE_ZLIB_HEADER,即解析 zlib 头部 |
返回值
返回值类型 | 解释 |
---|---|
string | 若解压成功,返回数据字符串,否则返回 nil |
六、代码示例介绍
6.1 解压数据
先将压缩过的字符串进行 base64 解码,然后再解压:
-- 压缩过的字符串, 为了方便演示, 这里用了base64编码
-- 大部分MCU设备的内存都比较小, miniz.compress 通常在服务器端完成,这里就不演示了
-- miniz能解压标准zlib数据流
-- 将字符串进行base64解码
local b64str = "eAEFQIGNwyAMXOUm+E2+OzjhCCiOjYyhyvbVR7K7IR0l+iau8G82eIW5jXVoPzF5pse/B8FaPXLiWTNxEMsKI+WmIR0l+iayEY2i2V4UbqqPh5bwimyEuY11aD8xeaYHxAquvom6VDFUXqQjG1Fek6efCFfCK0b0LUnQMjiCxhUT05GNL75dFUWCSMcjN3EE5c4Wvq42/36R41fa"
local str = b64str:fromBase64()
-- 快速解压
local dstr = miniz.uncompress(str)
压缩数据然后解压:
-- 演示压缩解压
local ostr = "abcd12345"
-- 压缩字符串
local zstr = miniz.compress(ostr)
-- 解压字符串
local lstr = miniz.uncompress(zstr)
log.info("miniz","compress zstr",#zstr,"uncompress lstr data",lstr)
七、功能验证
成功解压:
八、总结
本例程介绍了如何压缩和解压数据。
扩展
常见问题
1、解压数据不能超过多少?
解压后的数据不能大于 32k。
<!-- ## 给读者的话
本篇文章由
Linden
开发;本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air700ECQ-LuatOS-软件指南-通用工具库-zlib解压;
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金! -->