1 个不稳定版本
0.4.1 | 2023年11月13日 |
---|
#233 在 压缩 中
63KB
1K SLoC
heatshrink-rs
为嵌入式系统提供最小化 no_std 实现 heatshrink 压缩与解压缩
此库是将原始的 heatshrink C 库 粗糙地移植到 RUST 的。
移植仅限于 C 库的 "静态" 版本,这意味着 heatshrink 参数被硬编码为 window_sz2 = 8 和 lookahead_sz2 = 4。
由于是 no_std 库(因此不支持动态分配),目前无法选择自己的压缩参数。
主要功能
- 低内存使用:适用于许多需要小内存的一般情况。
- 增量、有限的 CPU 使用:您可以以任意小的数据块处理输入数据。这在硬实时环境中非常有用。
- 由于 no_std 的限制,目前仅限于静态版本:没有使用动态分配。
- ISC 许可证:您可以免费使用它,甚至用于商业目的。
入门指南
基本用法
-
使用
HeatshrinkEncoder::new
或HeatshrinkDecoder::new
分配 heatshrink 编码器或 heatshrink 解码器状态机。您也可以通过在状态机上调用reset
函数来重置现有状态机。 -
使用
sink
将输入缓冲区放入状态机。在返回的结果中,您得到一个 CR 码和实际消耗的字节数(如果消耗了 0 字节,则缓冲区已满)。 -
使用
poll
将输出从状态机移动到输出缓冲区。在返回的结果中,您得到一个 CR 码和写入提供的缓冲区的字节数。
重复步骤 2 和 3 以通过状态机流式传输数据。由于它是进行数据压缩,输入和输出大小可以显著不同。需要循环来缓冲输入和输出,以便在处理数据时进行处理。
- 当输入流结束时,调用
finish
来通知状态机没有更多输入可用。从finish
返回的值将指示是否还有输出。如果有,请调用poll
来获取更多。
继续调用finish
和poll
,直到finish
指示输出已耗尽。
在调用finish
后添加更多数据将不会工作,除非在状态机上调用reset
。
配置
在这个RUST实现中不需要配置(目前),因为参数不是用户定义的(它们是硬编码的)。
在cargo构建命令中,您可以选择启用查找表以通过在cargo命令行上选择--features "heatshrink-use-index"来加速压缩阶段。
更多信息与基准测试
heatshrink基于LZSS,因为它特别适合在少量内存中进行压缩。它可以使用一个可选的、小的索引来使压缩速度显著加快,但否则可以在不到100字节的内存下运行。索引目前将2^(window size+1)字节添加到压缩时的内存使用中,并在索引构造期间临时在堆栈上分配512字节(如果启用索引)。
有关更多信息,请参阅博客文章以获取概述。
依赖关系
~1.2–1.8MB
~34K SLoC