极简哈夫曼编码模块,仅包含变长编码部分,不包含原始码长度、编码字典等任何多余信息。 模块可以直接用于C++代码项目,也可以打包生成为Python Module,生成时Python版本为3.7,最小依赖Python3.3(未测试)。
可以直接无权重设置编码表
import huffman as hf
codec = hf.codec()
keys = [-1,0,1]
codec.set_codec(keys)
a = [-1,0,-1,0,0,0,1,1,1,-1]
codes = codec.encode(a)
b = codec.decode(codes)
也可以设置带权编码表
import huffman as hf
codec = hf.codec()
keys = [-1,0,1]
vals = [0.1, 0.8, 0.1]
codec.set_codec_with_value(keys, vals)
a = [-1,0,-1,0,0,0,1,1,1,-1]
codes = codec.encode(a)
b = codec.decode(codes)
CodecUInt8_T.h
C++顶层编码器类,接受带权码构造和等权码构造,有encode和decode两个成员方法。只适用于对T_Code(char)类型的数据进行编码。
class CharCodex{
// 使用给定的编码和出现概率构造编码器
// @param codes:原始码
// @param value:概率密度
// @param len: 原始码数组长度
CharCodex(const T_Code* codes, const double* value, int len);
// 使用给定数量的原始码构建编码器
// 实现的是等概率变长编码
// @param codes:原始码
// @param len: 原始码数组长度
CharCodex(const T_Code* codes, int len);
// 返回平均编码长度
// @return: 返回平均编码长度
int average_code_len();
// 对原始码进行编码
// @param source: 待编码的原始码序列,char数组
// @param source_len: 待编码的原始序列长度
// @param buffer: 写入缓冲区
// @param buffer_len: 写入缓冲区长度
// @return: 返回写入了多少字节
int encode(const T_Code* source, int source_len, char* buffer, int buffer_len) const;
// 对编码值进行解码
// @param source: 待解码的编码序列,char数组
// @param source_len: 待解码的编码序列长度
// @param buffer: 写入缓冲区
// @param buffer_len: 写入缓冲区长度
// @return: 返回解码了多少字节
int decode(const char* source, int source_len, T_Code* buffer, int buffer_len) const;
}
HuffmanCodecUInt32_T.h
哈夫曼编码树泛型,最长可以构造32bit的变长编码表,被编码数据要求能存储于栈中且为POD格式。被编码数据的类型不限,需要有可用的小于运算符。
template<typename T>
class HuffmanTree{
// 使用大根堆构建哈夫曼编码
// @param codes: 编码序列
// @param value: 对应编码序列的权重数组
// @param len: 编码数组长度
void buildTree(const T* codes, const int* values, int len);
// 查找一个哈夫曼编码对应的原始码
// @param hCode: 对应哈夫曼编码的存储缓冲区,默认从第一个bit开始查找,直到找到一个完整的哈夫曼编码
// 本参数中包含的哈夫曼编码是左对齐的, 默认从最高位开始搜索。
// @return: 返回 HuffmanCodec 类,包含原始码和HuffmanCode码信息,
// 查找只返回第一个匹配的完整哈夫曼编码,后面的bit被忽略,
// 调用 getHuffmanCodeLen() 方法查看匹配了多长的huffman编码。
HuffmanCodec<T> process(unsigned int hCode) const;
// 查找一个原始码的对应哈夫曼编码
// @param srcCode: 原始码
// @return: 返回 HuffmanCodec 类,包含原始码和HuffmanCode码信息,
// 使用 hasCodec() 调用检查是否查找到了有效的哈夫曼编码
HuffmanCodec<T> find(T srcCode) const;
};
// 从原始码编码至哈夫曼编码的编码结果
// getSourceCode() 获取原始码
// getHuffmanCode() 获取哈夫曼编码
// getHuffmanCodeLen() 获取哈夫曼编码的bit长度
// 哈夫曼编码存储是右对齐的,高位置0,从最低位至 getHuffmanCodeLen() 位存储了有效的哈夫曼编码值
template<typename T>
class HuffmanCodec;