5个版本 (破坏性更新)
0.6.0 | 2023年12月21日 |
---|---|
0.5.0 | 2023年12月2日 |
0.4.0 | 2023年12月1日 |
0.2.0 | 2023年11月22日 |
0.1.0 | 2023年11月21日 |
#352 in 压缩
每月45次下载
255KB
5.5K SLoC
preflate-rs
preflate-rs是将C++ preflate库移植到Rust,用于将deflate流分割为未压缩数据和重建信息,或者从这两个中重建原始的deflate流。
重要:此库仍在初始开发阶段,因此可能会非常频繁地进行破坏性更改。
然后可以使用更现代的压缩技术(如Zstd、lzma等)重新压缩生成的未压缩内容。此库旨在作为需要精确二进制存储内容的云存储系统的一部分使用,因此库需要确保DEFLATE内容被精确地重建。这不是一件简单的事,因为DEFLATE在选择距离/长度对以及Huffman树创建方面都有很大的自由度。
库试图检测以下压缩器,以尽量做到合理
- Zlib:Zlib几乎完美压缩。
- MiniZ:最快模式使用不同的哈希函数。
- Libdeflate:此库使用4字节哈希表,我们试图检测。
一般方法如下
- 将流解压缩成明文和包含字面量(字节)或距离、长度对的块的列表。
- 估算扫描内容以估算用于压缩的参数。估算越好,我们在尝试重建压缩时需要的更正就越少。
- 使用上面收集的参数重新运行使用zlib算法的压缩。使用差异编码器记录每个实例,其中我们的DEFLATE实现预测的标记与我们在文件中找到的标记不同。
以下差异被更正
- 块类型(未压缩、静态Huffman、动态Huffman)
- 块中标记的数量(通常是16386)
- 动态Huffman编码(使用zlib算法估算,但构建更或更优长度限制的Huffman码有多种方法)
- 字面量与(距离,长度)对(通过单个比特进行更正)
- 长度或距离不正确(通过编码回跳到正确值的步数进行更正)
- 奇怪的258长度大小(标准允许两种不同的编码)
请注意,重压缩信息的数据格式与原始预压缩实现不同且不兼容,因为该库使用了一个不同的算术编码器(来自Lepton JPEG压缩库)。
如何使用此库
从源码构建
git clone https://github.com/microsoft/preflate-rs
cd preflate-rs
cargo build
cargo test
cargo build --release
运行
项目包含一个preflate_util.exe
包装器,可以用来测试库对Deflate压缩内容的兼容性。
贡献
您可以以多种方式参与此项目,例如
行为准则
本项目采用了Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或通过[email protected]提出任何额外的问题或意见。
许可
版权(c)微软公司。保留所有权利。
根据Apache 2.0许可协议授权。
依赖
~8MB
~161K SLoC