实战 | 睿擎平台 zlib: 嵌入式数据压缩方案,从移植到应用一文打通

来源:RT-Thread操作系统 嵌入式开发 50 次阅读
摘要:在嵌入式开发中,存储空间和网络带宽一直是稀缺资源:数据库文件太大存不下、传感器数据量大传不动、固件升级包占用过多 Flash......传统方案要么忍着不上压缩,要么引入复杂的自研压缩逻辑,踩坑多、维护难。 今天分享一个基于睿擎派 RC3506 的完整 zlib 方案——从源码移植到应用实战,提供两种压缩方式,手把手带你搞定嵌入式数据压缩。 为什么选 zlib? zlib 是全世界部署最广泛的压缩

在嵌入式开发中,存储空间和网络带宽一直是稀缺资源:数据库文件太大存不下、传感器数据量大传不动、固件升级包占用过多 Flash......传统方案要么忍着不上压缩,要么引入复杂的自研压缩逻辑,踩坑多、维护难。

今天分享一个基于睿擎派 RC3506 的完整 zlib 方案——从源码移植到应用实战,提供两种压缩方式,手把手带你搞定嵌入式数据压缩。

为什么选 zlib?

zlib 是全世界部署最广泛的压缩库引擎:

  • 纯 C 实现:无操作系统依赖,无第三方库依赖,天然适合嵌入式移植

  • 体积极小:核心源码约 200KB(可裁剪),RAM 占用可控

  • 算法成熟:deflate 算法经过 30 年工业级优化,兼顾压缩率与速度

  • 标准兼容:gzip 格式与 PC 端 gunzip、7-zip、WinRAR 完全兼容

  • 授权友好:zlib License,商用免费,无需开源你的应用

从 Linux 内核、Git 仓库、PNG 图片到 HTTP 传输,zlib 几乎无处不在。对于 RT-Thread 嵌入式平台,它同样是数据压缩的首选方案。

架构总览

整个 zlib for RT-Thread 方案分三层,提供两种压缩方式:

核心移植工作集中在源码裁剪与编译适配,应用层直接调用 zlib 原始 API,无需中间封装层。

两种压缩方式对比

选哪个? 如果压缩后的数据只在嵌入式设备之间传递(如通过串口、网络、SPI Flash),用方式一;如果压缩后的文件需要拷贝到 PC 上解压,用方式二。

实战示例:文件压缩测试

解压缩代码

压缩文件的核心代码

#方式一:compress压缩comp_len = compressBound(file_size);ret = compress2((Bytef *)compressed, &comp_len,                (const Bytef *)buf, file_size, level);write(fd_dst, &file_size, 4);#写 4 字节头write(fd_dst, compressed, comp_len);#写压缩数据
#方式二:gzip 压缩gz_out = gzopen(dst_path, "wb");gzsetparams(gz_out, level, Z_DEFAULT_STRATEGY);gzwrite(gz_out, buf, file_size);gzclose(gz_out);

解压文件的核心代码

#方式一:uncompress解压ret = uncompress((Bytef *)decompressed, &out_len,                 (const Bytef *)compressed, comp_size);
#方式二:gzip 文件解压 gz_in = gzopen(src_path, "rb");while ((bytes_read = gzread(gz_in, buf, sizeof(buf))) > 0){write(fd_dst, buf, bytes_read);}gzclose(gz_in);

Shell 命令调试

采用示例工程 12_data_parsers_sqlite,对已经实现的完整的学生成绩数据库进行压缩。

msh />create_student_tbl                #建库建表msh /data>stu add 1000                  #随机插入1000条学生的信息msh /data>stu                             #查询全部test get all studentsid:1    name:Student63682       score:36id:2    name:Student63683       score:37id:3    name:Student63685       score:39id:4    name:Student63688       score:42...record(s):1000msh /data>gz_cmd file /data/stu_info.db /data/stu_info.gz #文件压缩Read /data/stu_info.db: 36864 bytes    CRC32 of original: 0x1127fd36Written /data/stu_info.gz: 8921 bytes (gzip format)Compression: 36864 -> 8921 bytes, saved 75.8%Compress OK, level=default(6)This file can be decompressed with: gunzip /data/stu_info.gzmsh />zlib_cmd compress /data/stu_info.db /data/stu_info.a#文件压缩Read /data/stu_info.db: 36864 bytesWritten /data/stu_info.a: 8909 + 4(header) = 8913 bytesCompression: 36864 -> 8909 bytes, saved 75.8%Adler32: 0xce833860Compress OK, level=default(6)msh /data>lsDirectory /data:stu_info.a          8913stu_info.gz         8921stu_info.db         36864msh /data>gz_cmd unfile /data/stu_info.gz /data/stu_info_gz.db #文件解压CRC32 of decompressed: 0x1127fd36Read /data/stu_info.gz (gzip format)Written /data/stu_info_gz.db: 36864 bytesmsh />zlib_cmd decompress /data/stu_info.a /data/stu_info_z.db #文件解压Read /data/stu_info.a: 8913 bytes (raw_size: 36864)Written /data/stu_info_z.db: 36864 bytesAdler32: 0xce833860Decompress OKmsh /data>ls #查询文件是否存在Directory /data:stu_info_z.db       36864stu_info_gz.db      36864stu_info.a          8913stu_info.gz         8921stu_info.db         36864

压缩率实测

以 SQLite 学生数据库文件(36864 bytes)为例:

总结

zlib 为嵌入式设备提供了工业级的数据压缩能力,纯 C 实现、零依赖、许可证友好。本方案提供两种方式,覆盖嵌入式开发中的常见压缩需求。

关键要点回顾

✅ 纯算法库,移植零门槛:不需要任何操作系统适配

✅ 两种方式,按需选择:设备内部传输用compress压缩,PC 互传采用gz压缩

✅ 直接调用 zlib 原始 API:无需中间封装层,且均原生线程安全

✅ 压缩率实测:SQLite 数据库文件压缩后节省约75%

相关推荐
评论区

登录后即可参与讨论

立即登录