#huffman-coding #compression-decompression #decompression

huff_coding

Huffman编码算法的实现,允许用户创建任何他们选择的字母表的Huffman树

3个版本 (1个稳定版)

1.0.0 2021年2月27日
0.0.1 2021年1月20日
0.0.0 2021年1月20日

404压缩

每月 23次下载
huff 中使用

GPL-2.0-or-later

85KB
986

huff_coding

Crate Documentation

License

Huffman编码算法的实现,允许用户创建任何他们选择的字母表的Huffman树。

它主要围绕HuffTree结构体,该结构体提供了一种为任何实现了HuffLetter特质的类型集合生成Huffman前缀码的方式,对于每个字母都有一个相应的权重(为了确保这一点,必须在提供的集合上实现Weights特质)。如果提供的字母也实现了HuffLetterAsBytes特质,则树可以轻松地以二进制形式读取或返回。

示例

use huff_coding::{

prelude::*,

bitvec::prelude::*,

};

  

// every primitive type (except floats) implements HuffLetter
let bytes = [0xff, 0xff, 0xff, 0xaa, 0xaa, 0xcc];
let chars = ['a', 'a', 'a', 'b', 'b', 'c'];
let ints = [-32, 123, -32, -32, 75, 123];


// ------ building weights structs ------

// building weights with the ByteWeights struct
let byte_weights =  ByteWeights::from_bytes(&bytes);
// building weights in the form of a HashMap
let char_weights =  build_weights_map(&chars);
let int_weights =  build_weights_map(&ints);


// ------ initializing HuffTrees ------

let tree_bytes =  HuffTree::from_weights(byte_weights);
let tree_chars =  HuffTree::from_weights(char_weights);
let tree_ints =  HuffTree::from_weights(int_weights);


// ------ reading codes from a tree ------
let char_codes = tree_chars.read_codes();
assert_eq!(
    char_codes.get(&'a').unwrap(),
    &bitvec![Msb0, u8; 0]
);
assert_eq!(
    char_codes.get(&'b').unwrap(),
    &bitvec![Msb0, u8; 1, 1]
);
assert_eq!(
    char_codes.get(&'c').unwrap(),
    &bitvec![Msb0, u8; 1, 0]
);


// ------ HuffTree in binary ------

// every integer implements HuffLetterAsBytes
let tree_bytes_bin = tree_bytes.as_bin();
assert_eq!(tree_bytes_bin.to_string(), "[10111111, 11101100, 11000101, 01010]");
// reading a HuffTree from a binary representation
let tree_bytes_from_bin =  HuffTree::<u8>::try_from_bin(tree_bytes_bin).unwrap();
assert_eq!(tree_bytes.read_codes(), tree_bytes_from_bin.read_codes());

还包括使用我对此算法的实现编写的示例压缩/解压缩函数。

use huff_coding::prelude::*;



let bytes =  b"abbccc";
let comp_data =  compress(bytes);
let decomp_bytes =  decompress(&comp_data);

assert_eq!(bytes.to_vec(), decomp_bytes);

该软件包中的每个二进制表示都是通过bitvec软件包实现的,我已经为了方便将其重新导出。

依赖关系

~1MB
~23K SLoC