2 个版本

0.1.1 2021年7月29日
0.1.0 2021年7月18日

#344 in 压缩

MIT 许可证

780KB
919

lzd-rs

Documentation Crates.io

此库提供了 LZ 双因子分解的 Rust 实现,这是一种高效的基于语法的压缩算法,由以下论文提出:

K Goto, H Bannai, S Inenaga, 和 M Takeda. LZD 分解:具有可变到固定编码的简单实用在线语法压缩。CPM,2015。

示例

因子分解

use lzd::compressor::Compressor;

fn main() {
    // Input text
    let text = "abaaabababaabbabab".as_bytes();

    // Factorization
    let mut factors = Vec::new();
    let defined_factors = Compressor::run(text, |id: usize| {
        factors.push(id);
    });

    // Output factors
    println!("factors: {:?}", factors);

    // Statistics
    println!("defined_factors: {:?}", defined_factors);
}

输出将为

factors: [97, 98, 97, 97, 256, 256, 256, 257, 98, 98, 258]
defined_factors: 261

注意:在此实现中,所有 256 个单字符都被预定义为目标,因此定义的目标数量将变为 261。

反因子分解

use lzd::decompressor::Decompressor;

fn main() {
    // Input text
    let factors = [97, 98, 97, 97, 256, 256, 256, 257, 98, 98, 258];

    // Defactorization
    let mut text = String::new();
    Decompressor::run(&factors, |c: u8| {
        text.push(c as char);
    });

    // Decoded text
    println!("text: {:?}", text);
}

输出将为

text: "abaaabababaabbabab"

命令行工具

此库提供了两个命令行工具用于压缩和解压缩。通过指定参数 -h,工具将打印命令行选项。

在工具中,LZ 目标以与 tudocomptdc::BitCorder 相同的方式序列化到二进制流中。

lzd 命令

它压缩输入数据并将结果写入扩展名为 lzd 的文件。在以下情况下,english.50MB.lzd 将作为压缩文件写入。

$ lzd english.50MB
Compressed filename will be /home/kampersanda/dataset/pizzachili/text/english/english.50MB.lzd
52428800 bytes were compressed into 16426243 bytes (31.33%)
52428800 characters were factorized into 6354129 LZD-factors (12.12%)
3177320 LZD-factors were defined

unlzd 命令

它解压缩压缩文件并将原始数据写入没有扩展名 lzd 的文件。在以下情况下,english.50MB 将作为解压缩文件写入。

$ ./target/release/unlzd english.50MB.lzd

许可证

此库是在 MIT 下提供的免费软件。

依赖项

~0.6–1MB
~10K SLoC