14 个版本
0.1.8 | 2024年1月22日 |
---|---|
0.1.7 | 2022年7月10日 |
0.1.6 | 2022年4月21日 |
0.1.5 | 2021年4月17日 |
0.1.0-alpha | 2020年7月27日 |
25 在 压缩 中排名 25
1,400,865 每月下载量
用于 2,105 个crate(13 个直接使用)
115KB
2K SLoC
weezl
LZW 编码和解码,速度飞快!
概述
这个库完全使用安全和无依赖的 Rust 编写,为 GIF 和 TIFF 图像格式中的 LZW 压缩提供编码和解码。它有一个独立的二进制文件,可以用来处理这些数据流,但它不兼容 Spencer 的 compress
和 uncompress
二进制文件(尽管以后可能会开发一个直接替换的版本)。
在 no_std
环境中使用也是可能的,尽管需要一个分配器。这也可能在以后的版本中放宽。已经存在一个功能标志,但目前几乎关闭了所有接口。
许可
所有代码都采用 MIT 或 Apache-2.0 双许可。
lib.rs
:
LZW 解码器和编码器
这个crate为其各自的模块提供了一个 Encoder
和一个 Decoder
。代码字从和写入位字节切片(或流)中,可以首先写入最高位或最低位。可能的最大代码大小是 12 位,最小的可用代码大小是 2 位。
示例
这两个代码块显示了压缩和相应的解压缩。请注意,您必须使用与 Encoder
和 Decoder
相同的参数,否则解压缩可能会失败或产生错误的结果。
use weezl::{BitOrder, encode::Encoder};
let data = b"Hello, world"; let compressed = Encoder::new(BitOrder::Msb, 9) .encode(data) .unwrap();
use weezl::{BitOrder, decode::Decoder};
let decompressed = Decoder::new(BitOrder::Msb, 9)
.decode(&compressed)
.unwrap();
assert_eq!(decompressed, data);
LZW 详细信息
解码器和编码器期望 LZW 流从清除代码开始并以结束代码结束,这些代码如下定义
CLEAR_CODE == 1 <<min_code_size
END_CODE == CLEAR_CODE + 1
为了最佳性能,所有缓冲区和输入输出切片应尽可能大,至少为2048字节。这同样适用于输入流,其缓冲区也应具有相似的大小。此库使用Rust的标准分配接口(Box
和Vec
)进行精确控制。由于没有处理分配错误的方法,因此不建议在16位目标上运行。
分配和标准库
主算法也可以在no_std
中使用,尽管它需要一个分配器。这一限制可能会在以后阶段被取消。为此,您应该禁用std
功能。主要接口保持不变,但into_stream
组合器不可用。
依赖项
~175KB