3个版本 (1个稳定版)
1.0.0 | 2021年2月27日 |
---|---|
0.0.1 | 2021年1月20日 |
0.0.0 | 2021年1月20日 |
404 在 压缩
每月 23次下载
在 huff 中使用
85KB
986 行
huff_coding
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