5个版本
0.9.1 | 2023年5月15日 |
---|---|
0.9.0 | 2023年2月1日 |
0.8.2 | 2021年9月26日 |
0.8.1 | 2021年7月15日 |
0.8.0 | 2021年6月7日 |
#102 in 压缩
2,023次每月下载
在 lzss-cli 中使用
65KB
1K SLoC
crate lzss
从0.8到0.9的重要更改/破坏性更改
- 特性
safe
已添加并默认启用,请参阅下面的安全性 - 特性
const_panic
已移除,现在始终启用 - 泛型的de-/compress重命名为de-/compress_stack
Lempel–Ziv–Storer–Szymanski解/压缩
lzss
是一个纯Rust编写的无损数据压缩算法。这个crate是为嵌入式系统构建的
- 小型代码大小
- 占用很少的RAM和CPU
no_std
功能- 所有参数都可以是编译时参数
泛型与动态
这个crate有两种形式:泛型(Lzss
)和动态(LzssDyn
)。
动态版本有一个压缩函数,所有参数都在运行时传递给它,这使得它非常灵活。
泛型版本具有编译时参数,将为每组不同的参数生成一个函数。这个函数将由编译器比动态版本更优化,缺点是使用多个参数集时会生成多个函数。
(同样适用于解压缩和其他函数,只有使用的函数将包含在生成的程序中。)
没有头文件
这个算法设计上没有任何头文件。请注意,无法检查内容是否正确,甚至长度是否匹配。建议根据需求添加头文件。
来源
此代码基于Haruhiko Okumura的LZSS编码器-解码器,位于公共领域。
为了创建与上述程序兼容的编码器-解码器,以下内容是必需的:在此库中C = 0x20
,在Okumura的程序中P = (1+EI+EJ) / 9
。
特性
alloc
- 允许使用堆上的缓冲区和VecWriter
进行解/压缩。safe
- 仅使用安全代码(见下面的安全性说明)。std
- 启用alloc
以及额外的IOSimpleReader
、IOSimpleWriter
以及Error
实例,用于LzssError
和LzssDynError
。
std
和 safe
默认启用。
用法
默认情况下(std
和 safe
)
[dependencies]
lzss = "0.9"
使用 no_std
(且不使用 safe
)
[dependencies]
lzss = { version = "0.9", default-features = false }
示例
type MyLzss = Lzss<10, 4, 0x20, { 1 << 10 }, { 2 << 10 }>;
let input = b"Example Data";
let mut output = [0; 30];
let result = MyLzss::compress(
SliceReader::new(input),
SliceWriter::new(&mut output),
);
assert_eq!(result, Ok(14)); // there was no overflow and the output is 14 bytes long
安全性
使用 safe
功能时,代码不使用任何不安全代码(forbid(unsafe_code)
),但会牺牲性能和大小 - 尽管在现代系统中这并不重要。
但在小型系统(如需要 no_std
的微控制器)上可能会很明显。这也是为什么它可以打开/关闭的原因。
命令行界面
为了在命令行中解压缩文件,请安装 lzss-cli
cargo install lzss-cli
示例
lzss e 10,4,0x20 <input >outout