#no-alloc

无 std zerocrush

稀疏文件的低开销压缩

1 个不稳定版本

0.1.0 2024年4月14日

#162#压缩

MIT 许可证

40KB
925

zerocrush

Documentation Crates.io

此存储库实现了一种专为包含大量零位长序列的数据设计的安全 Rust 压缩算法,具有在压缩和解压缩时内存和代码尺寸非常小的特点,同时在此类输入上获得非常令人满意的压缩比率。

这不是一个交换格式。

理由

开发此库的原始动机是为包含在资源受限的嵌入式软件中的 FPGA 位流进行压缩。我们希望在尽可能不使用如 zlib 这样的资源密集型解压缩器的情况下,尽可能多地压缩位流(通常相当稀疏)。相比之下,zerocrush 解压缩器在32位目标上仅需要20字节的内存状态,并具有非常小的代码占用,同时仍能实现合理的吞吐量。

zerocrush 的前缀码灵感来源于 IceStorm 项目之前的工作,形式为 icecompr,并将该方法进一步推进,以在典型的位流上获得可衡量的更好的压缩比率,同时简化了生成的压缩器和解压缩器实现,使其在嵌入式设备上具有合理的效率。

前缀码符号

压缩表示由前缀码符号的串联组成,从最高位开始,用零填充到8的倍数。符号来自两个不同的前缀码,分别称为“模式0”和“模式1”,每个符号交替出现(除以下所述的特殊符号外),以模式0开始。

模式0表

符号 表示
1x 0 × [1 to 2]
01xx 0 × [3 to 6]
001xxx 0 × [7 to 14]
0001xxxx 0 × [15 to 30]
00001xxxxx 0 × [31 to 62]
000001xxxxxx 0 × [63 to 126]
0000001xxxxxxx 0 × [127 to 254]
00000001xxxxxxxx 0 × [255 to 510]
000000001xxxxxxxxx 0 × [511到1022]
0000000001xxxxxxxxxx 0 × [1023到2046]
00000000001xxxxxxxxxxx 0 × [2047到4094]
000000000001xxxxxxxxxxxx 0 × [4095到8190]
000000000000xxxxxxxxxxxx 0 × [8191到12284]

模式1表

符号 表示
1 1 × 1
01 1 × 2
001 1 × 3
0001 1 × 4
00001 1 × 5
000001 1 × 6
0000001 1 × 7
00000001 1 × 8
000000001 1 × 9
0000000001 1 × 10
00000000001 1 × 11
000000000001 1 × 12
000000000000xxxxxxxxxxxx 1 × [13到4106]

以下三个符号在两种模式中都有相同的表示,并带有影响解压缩器操作的特殊意义。模式改变和终止符号不表示任何数据,而继续符号则根据上述模式表表示数据。

符号 描述
000000000000111111111101 继续符号
000000000000111111111110 模式改变符号
000000000000111111111111 终止符号

继续符号旨在帮助表示任意长度的0和1的序列,并导致解压缩器不改变模式。模式改变符号导致解压缩器立即改变模式,通常只在压缩流的开始处遇到(如果输入没有以零位开始),或者在继续数据长度为零之后。终止符号假设是压缩流的最后一个符号。

此表示没有内置的帧或校验和机制。任何以终止符号结束的位序列都代表一个有效的压缩流,但是库能够验证压缩流是否正确地以零填充,并且解压缩输出是否以字节边界结束。可以通过在压缩流前添加标题和在压缩流后添加校验和等方式,在更高级别添加额外的检查。

没有运行时依赖