11个版本

0.3.1 2022年9月20日
0.3.0 2022年9月20日
0.2.6 2022年9月13日
0.1.2 2022年9月11日

#227 in 压缩

Download history 21/week @ 2024-03-01 11/week @ 2024-03-08 23/week @ 2024-03-15 26/week @ 2024-03-22 19/week @ 2024-03-29 78/week @ 2024-04-05 11/week @ 2024-04-12 40/week @ 2024-04-19 80/week @ 2024-04-26 11/week @ 2024-05-03 1/week @ 2024-05-10 7/week @ 2024-05-24 44/week @ 2024-05-31 20/week @ 2024-06-07 9/week @ 2024-06-14

每月80次下载
用于 3 个crate(2个直接使用)

MIT 许可证

64KB
1.5K SLoC

banzai

banzai是一个纯Rust bzip2编码器。目前它还是alpha版本软件,这意味着它只经过了有限的测试,不应依赖于它良好地工作且不会损坏您的数据。但这并不意味着我不关心性能或可靠性 - 欢迎提交bug报告!从长远来看,我希望这个库能够达到可以用于生产软件的程度。

要使用banzai作为类似bzip(1)的命令行工具,可以通过cargo安装bnz

这个库在输入大小上是线性时间的,并且没有使用unsafe。当它更加成熟时,这些特性将使它成为安全关键应用的不错选择。

一般来说,banzai达到与参考实现相似的压缩率。然而,通常运行时间大约是两倍(不考虑参考实现使用其回退算法的情况,这要慢得多)。我认为这是因为运行时间主要由Burrows-Wheeler变换主导。由于bzip2使用BWT的“环绕”版本,banzai必须计算输入自身拼接的后缀数组。我打算研究如何利用这种形式输入的固有冗余来优化后缀数组构建。

这个库(目前)不包括解压缩器。Paolo Barbolini的bzip2-rs提供了一个纯Rust bzip2解压缩器,尽管我自己没有使用过,也不能对其质量进行保证。

接口

fn encode(reader: R, writer: io::BufWriter<W>, level: usize) -> io::Result<usize>
where
    R: io::BufRead,
    W: io::Write

使用输入缓冲区和BufWriter的引用调用encode。最后一个参数是level,它是一个介于19之间的数字(包含),对应于块大小(块大小为level * 100_000字节)。典型的默认值是9。返回编码的输入字节数。

致谢

这是一个原始的libre软件。然而,实施指南是从几个自由软件来源中提取的。

banzai中使用的后缀数组构建算法是SA-IS,由Ge Nong,Sen Zhang和Wai Hong Chan开发。SA-IS实现的指南来自Yuta Mori的sais和burntsushi的suffix

banzai中使用的Huffman编码实现从bzip2的参考实现中汲取了大量灵感,最初由Julian Seward编写,目前由Micah Snyder维护。

最后,Joe Tsai编写的非官方bzip2格式规范在bzip2二进制格式的具体方面非常有帮助。

依赖关系

~100KB