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-alpha2020年7月27日

25压缩 中排名 25

Download history 236817/week @ 2024-04-20 235577/week @ 2024-04-27 230562/week @ 2024-05-04 244462/week @ 2024-05-11 268100/week @ 2024-05-18 256840/week @ 2024-05-25 318819/week @ 2024-06-01 305633/week @ 2024-06-08 304105/week @ 2024-06-15 326044/week @ 2024-06-22 309930/week @ 2024-06-29 327838/week @ 2024-07-06 339436/week @ 2024-07-13 339364/week @ 2024-07-20 339552/week @ 2024-07-27 320247/week @ 2024-08-03

1,400,865 每月下载量
用于 2,105 个crate(13 个直接使用)

MIT/Apache

115KB
2K SLoC

weezl

LZW 编码和解码,速度飞快!

概述

这个库完全使用安全和无依赖的 Rust 编写,为 GIF 和 TIFF 图像格式中的 LZW 压缩提供编码和解码。它有一个独立的二进制文件,可以用来处理这些数据流,但它不兼容 Spencer 的 compressuncompress 二进制文件(尽管以后可能会开发一个直接替换的版本)。

no_std 环境中使用也是可能的,尽管需要一个分配器。这也可能在以后的版本中放宽。已经存在一个功能标志,但目前几乎关闭了所有接口。

许可

所有代码都采用 MIT 或 Apache-2.0 双许可。


lib.rs:

LZW 解码器和编码器

这个crate为其各自的模块提供了一个 Encoder 和一个 Decoder。代码字从和写入位字节切片(或流)中,可以首先写入最高位或最低位。可能的最大代码大小是 12 位,最小的可用代码大小是 2 位。

示例

这两个代码块显示了压缩和相应的解压缩。请注意,您必须使用与 EncoderDecoder 相同的参数,否则解压缩可能会失败或产生错误的结果。

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的标准分配接口(BoxVec)进行精确控制。由于没有处理分配错误的方法,因此不建议在16位目标上运行。

分配和标准库

主算法也可以在no_std中使用,尽管它需要一个分配器。这一限制可能会在以后阶段被取消。为此,您应该禁用std功能。主要接口保持不变,但into_stream组合器不可用。

依赖项

~175KB