#heatshrink #environments #dynamic #allocation

heatshrink-lib

适用于no_std环境的最小化实现heatshrink压缩算法的库

1 个不稳定版本

0.4.1 2023年11月13日

#504压缩


heatshrink-bin 中使用

ISC 许可证

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

入门指南

基本用法

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

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

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

重复步骤2和3,通过状态机传输数据。由于它是进行数据压缩,输入和输出大小可能会有很大差异。需要循环以缓冲输入和输出,以便在数据处理时进行处理。

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

继续调用 finishpoll,直到 finish 指示输出已耗尽,以刷新剩余的输出。

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

配置

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

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

更多信息与基准测试

heatshrink 基于基于 LZSS,因为它特别适合内存中的压缩。它可以使用可选的小型 索引,以显著加快压缩速度,但通常可以在 100 字节以下的内存中运行。当前索引将增加 2^(window size+1) 字节到压缩时的内存使用,并在索引构建期间临时分配 512 字节到栈上(如果启用了索引)。

有关更多信息,请参阅概述的 博客文章

无运行时依赖