#algorithm #pure #dcl #table #symbol #data #decode

implode

纯Rust实现的DCL Implode算法。目前,仅支持解压缩。

2个版本

使用旧的Rust 2015

0.1.1 2018年2月11日
0.1.0 2018年2月11日

#671 in 压缩


mpq中使用

MIT许可协议

21KB
369

implode

纯Rust实现的DCL Implode算法。

目前,此crate仅支持解压缩。未来可能会根据deflate crate添加压缩功能。


lib.rs:

PKWARE DCL Implode算法的实现。请注意,这与PKZIP中的Imploding算法不同。此实现基于zlib/contrib/blast.c中的实现,但使用查找表来解码Shannon-Fano码,这要快得多。此实现不使用PKWARE数据压缩库(PKWARE DCL)中的任何代码。

use implode::symbol::{Symbol, CodeTable, DEFAULT_CODE_TABLE, decode_bits};
use implode::exploder::Exploder;
use std::fs::File;
use std::io::Read;
use std::io::Write;

fn main() 
{
	let mut f = File::open("/path/to/input").expect("File open failed");
	let mut buf = [0u8; FILE_SIZE];
	f.read(&mut buf);
	let mut exploder = Exploder::new(&DEFAULT_CODE_TABLE);
	
	let mut ex = File::create("/path/to/output").expect("File create failed");
	let mut cpos: u32 = 0;
	let len = buf.len();
	let mut iter = 0;
	
	while !exploder.ended {
		
		let abuf = &mut buf[cpos as usize .. len];
		
		let x = exploder.explode_block(abuf).unwrap();
		cpos += x.0;
		
		//println!("{} {:?}",x.0, x.1);
		let bf = x.1;
	
		ex.write(bf);
		iter+=1;
	}
	
}

无运行时依赖