#heatshrink #environments #original #parameters #dynamic #allocation

app heatshrink-bin

为无_std 环境实现 heatshrink 压缩算法的最小化库

1 个不稳定版本

0.4.1 2023年11月13日

#233压缩

ISC 许可证

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 许可证:您可以免费使用它,甚至用于商业目的。

入门指南

基本用法

  1. 使用 HeatshrinkEncoder::newHeatshrinkDecoder::new 分配 heatshrink 编码器或 heatshrink 解码器状态机。您也可以通过在状态机上调用 reset 函数来重置现有状态机。

  2. 使用 sink 将输入缓冲区放入状态机。在返回的结果中,您得到一个 CR 码和实际消耗的字节数(如果消耗了 0 字节,则缓冲区已满)。

  3. 使用 poll 将输出从状态机移动到输出缓冲区。在返回的结果中,您得到一个 CR 码和写入提供的缓冲区的字节数。

重复步骤 2 和 3 以通过状态机流式传输数据。由于它是进行数据压缩,输入和输出大小可以显著不同。需要循环来缓冲输入和输出,以便在处理数据时进行处理。

  1. 当输入流结束时,调用finish来通知状态机没有更多输入可用。从finish返回的值将指示是否还有输出。如果有,请调用poll来获取更多。

继续调用finishpoll,直到finish指示输出已耗尽。

在调用finish后添加更多数据将不会工作,除非在状态机上调用reset

配置

在这个RUST实现中不需要配置(目前),因为参数不是用户定义的(它们是硬编码的)。

在cargo构建命令中,您可以选择启用查找表以通过在cargo命令行上选择--features "heatshrink-use-index"来加速压缩阶段。

更多信息与基准测试

heatshrink基于LZSS,因为它特别适合在少量内存中进行压缩。它可以使用一个可选的、小的索引来使压缩速度显著加快,但否则可以在不到100字节的内存下运行。索引目前将2^(window size+1)字节添加到压缩时的内存使用中,并在索引构造期间临时在堆栈上分配512字节(如果启用索引)。

有关更多信息,请参阅博客文章以获取概述。

依赖关系

~1.2–1.8MB
~34K SLoC