在嵌入式开发中,存储空间和网络带宽一直是稀缺资源:数据库文件太大存不下、传感器数据量大传不动、固件升级包占用过多 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 students
id:1 name:Student63682 score:36
id:2 name:Student63683 score:37
id:3 name:Student63685 score:39
id:4 name:Student63688 score:42
...
record(s):1000
msh /data>gz_cmd file /data/stu_info.db /data/stu_info.gz#文件压缩
Read /data/stu_info.db: 36864 bytes
CRC32 of original: 0x1127fd36
Written /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.gz
msh />zlib_cmd compress /data/stu_info.db /data/stu_info.a
#文件压缩
Read /data/stu_info.db: 36864 bytes
Written /data/stu_info.a: 8909 + 4(header) = 8913 bytes
Compression: 36864 -> 8909 bytes, saved 75.8%
Adler32: 0xce833860
Compress OK, level=default(6)
msh /data>ls
Directory /data:
stu_info.a 8913
stu_info.gz 8921
stu_info.db 36864
msh /data>gz_cmd unfile /data/stu_info.gz /data/stu_info_gz.db#文件解压
CRC32 of decompressed: 0x1127fd36
Read /data/stu_info.gz (gzip format)
Written /data/stu_info_gz.db: 36864 bytes
msh />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 bytes
Adler32: 0xce833860
Decompress OK
msh /data>ls#查询文件是否存在
Directory /data:
stu_info_z.db 36864
stu_info_gz.db 36864
stu_info.a 8913
stu_info.gz 8921
stu_info.db 36864
压缩率实测
以 SQLite 学生数据库文件(36864bytes)为例:

总结
zlib 为嵌入式设备提供了工业级的数据压缩能力,纯 C 实现、零依赖、许可证友好。本方案提供两种方式,覆盖嵌入式开发中的常见压缩需求。
关键要点回顾
纯算法库,移植零门槛:不需要任何操作系统适配
两种方式,按需选择:设备内部传输用compress压缩,PC 互传采用gz压缩
直接调用 zlib 原始 API:无需中间封装层,且均原生线程安全
压缩率实测:SQLite 数据库文件压缩后节省约75%
如果 zlib 移植还不够过瘾,我们将在直播中完整演示从源码获取到编译运行的全过程,并结合 SQLite 做落地实战。
直播预告|睿擎派实战:zlib 压缩库移植与嵌入式应用
本期是「开源软件包移植适配专题」第2期,聚焦 zlib 压缩库,手把手带你在睿擎派 RC3506 上完成移植,并与 SQLite 数据库结合,实现数据压缩落地。
直播核心内容:
zlib 原理与源码架构解析
源码获取、配置编译、完整移植流程
压缩/解压功能验证
结合 SQLite 数据库文件实测压缩率
直播时间:2026年5月27日(周三)20:00
参与方式:
点击预约,获取直播提醒
睿擎平台持续迭代,更多开源软件包移植适配,敬请期待。
配套资料包
想在自己的项目里复现 zlib 移植?我们整理了完整资料包,助你快速上手:
zlib 移植源码包(含编译脚本、交叉编译配置)
示例工程(RuiChing Studio 可直接导入)
扫码下方二维码,填写简单表单(1分钟),资料包将发送至邮箱。
想了解更多,欢迎联系我们

-
传感器
+关注
关注
2578文章
55792浏览量
795148 -
嵌入式
+关注
关注
5212文章
20756浏览量
338497 -
存储
+关注
关注
13文章
4934浏览量
90378
发布评论请先 登录
实战 | 睿擎平台SQLite:嵌入式设备上的数据持久化方案,从移植到应用一文打通
直播预告 | 睿擎派 3562 NullClaw 系统开发实战:把 AI 助手塞进工业开发板
睿擎派3562快速上手体验
明晚:睿擎物联网实战:从传感器采集到MQTT上云全流程解析|问学直播
【直播预告】下周三晚8点|睿擎物联网实战:从传感器采集到MQTT上云全流程解析
明晚8点|睿擎文件系统实战:从开发到发布全流程解析
【直播预告】下周三晚8点|睿擎文件系统实战:从开发到发布全流程解析
【直播预告】10月29日 周三 晚8点 |睿擎网络开发实战:从配置到应用,掌握工业级网络开发精髓!| 直播预告
【深圳站圆满收官】开发者线下实战,睿擎工业平台Workshop精彩回顾!|新闻速递
实战 | 睿擎平台 zlib: 嵌入式数据压缩方案,从移植到应用一文打通
评论