5个版本

0.2.0 2023年7月7日
0.1.3 2023年7月2日
0.1.2 2023年7月2日
0.1.1 2023年7月2日
0.1.0 2023年7月2日

#317压缩

Download history 69/week @ 2024-04-27 1/week @ 2024-05-04 29/week @ 2024-06-29 37/week @ 2024-07-27

每月下载 62

MIT 许可证

42KB
362

Documentation Crates.io dependency status Rust rust-clippy analyze DevSkim

Xpress_rs

MS-XCA([MS-XCA](https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-XCA/%5bMS-XCA%5d.pdf))中定义的xpress压缩算法的Rust实现。

正在进行中,目前仅实现了LZ77算法。

LZ77

  • 注释
  • 文档
  • 重写测试
  • 添加基准测试
  • 日志记录
  • 优化
    • 使用其他哈希表实现
    • 使用哈希函数制作自定义哈希表实现
    • 尝试链表哈希表、多个哈希表和树
    • 尝试避免哈希表重新分配(使用固定大小的哈希表)
    • 全局代码优化

日志记录

日志功能使用了大量的宏,因此执行时间不是最优的。我建议在发布模式下禁用日志功能,但在测试或调试时可能很有用。

  • 使用 "cargo test --features logging" 在测试中启用日志记录
  • 未来的版本将具有更多的日志功能(例如,仅编译所需的日志宏)

错误处理

错误处理不是最优的,可以进行改进。

在压缩算法中,输出缓冲区是一个固定大小的缓冲区,定义为输入缓冲区大小的两倍。我不确定这会导致缓冲区溢出。我没有在算法中检查大小,因为这会减慢算法速度,并且我不想使用向量来避免重新分配。--> TODO: 找到更好的实现方式。

示例

use xpress_rs::lz77::{LZ77Compressor,LZ77Decompressor};
use std::error::Error;

#[cfg(feature = "logging")]
 {
use env_logger::Env;
use log::{info, LevelFilter}; 
env_logger::Builder::new().filter(None, LevelFilter::Info).init();
}

// data to compress
let data_to_compress: Vec<u8> = b"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".to_vec();

// init the Compressor
let compressor = LZ77Compressor::new(data_to_compress);

// compress the data
let result: Result<Vec<u8>,Box<dyn Error>> = compressor.compress();

// check if the compression is successful
match result {
    Ok(compressed_data) => {
        // init the Decompressor
        let decompressor = LZ77Decompressor::new(compressed_data);

        // decompress the data
        let result: Result<Vec<u8>,Box<dyn Error>> = decompressor.decompress();

        // check if the decompression is successful
        match result {
            Ok(decompressed_data) => {
                println!("Decompressed data: {:?}",decompressed_data);
            },
            Err(e) => {
                println!("Error: {}",e);
            }
        }
    },
    Err(e) => {
        println!("Error: {}",e);
    }
}

依赖项

~100–750KB
~13K SLoC