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