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次下载

Apache-2.0LGPL-3.0-or-later

255KB
5.5K SLoC

preflate-rs

preflate-rs是将C++ preflate库移植到Rust,用于将deflate流分割为未压缩数据和重建信息,或者从这两个中重建原始的deflate流。

重要:此库仍在初始开发阶段,因此可能会非常频繁地进行破坏性更改。

然后可以使用更现代的压缩技术(如Zstd、lzma等)重新压缩生成的未压缩内容。此库旨在作为需要精确二进制存储内容的云存储系统的一部分使用,因此库需要确保DEFLATE内容被精确地重建。这不是一件简单的事,因为DEFLATE在选择距离/长度对以及Huffman树创建方面都有很大的自由度。

库试图检测以下压缩器,以尽量做到合理

  • Zlib:Zlib几乎完美压缩。
  • MiniZ:最快模式使用不同的哈希函数。
  • Libdeflate:此库使用4字节哈希表,我们试图检测。

一般方法如下

  1. 将流解压缩成明文和包含字面量(字节)或距离、长度对的块的列表。
  2. 估算扫描内容以估算用于压缩的参数。估算越好,我们在尝试重建压缩时需要的更正就越少。
  3. 使用上面收集的参数重新运行使用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