1 个不稳定版本
0.1.0 | 2024年4月14日 |
---|
#162 在 #压缩
40KB
925 行
zerocrush
此存储库实现了一种专为包含大量零位长序列的数据设计的安全 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的序列,并导致解压缩器不改变模式。模式改变符号导致解压缩器立即改变模式,通常只在压缩流的开始处遇到(如果输入没有以零位开始),或者在继续数据长度为零之后。终止符号假设是压缩流的最后一个符号。
此表示没有内置的帧或校验和机制。任何以终止符号结束的位序列都代表一个有效的压缩流,但是库能够验证压缩流是否正确地以零填充,并且解压缩输出是否以字节边界结束。可以通过在压缩流前添加标题和在压缩流后添加校验和等方式,在更高级别添加额外的检查。