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 在 压缩
每月下载 62 次
42KB
362 行
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