如何在c++中序列化Huffman树
How to serialize the Huffman tree in c++
正如标题所示,我想将我的huffman树序列化为编码文件的头。我看到了这个问题:存储huffman树的有效方法
我知道它是如何工作的,但我不能应用它,我已经写了这个代码:
typedef Node<char,unsigned long> Node;
void Encoder::EncodeNode(Node node)
{
if (node.left == &Node::NIL and node.right == &Node::NIL)
{
writeBit(1);
outFile << node.first;
}
else
{
writeBit(0);
EncodeNode(*node.left);
EncodeNode(*node.right);
}
}
这是我用来编码字符的writeBit函数:
void Encoder::writeBit(unsigned short bit)
{
if(bit < 2){//if not EOF
if(bit){
byteBuffer |= (1 << (7 - byteCursor));
}
byteCursor++;
if (byteCursor == 8) {
outFile << byteBuffer;
byteBuffer = 0;
byteCursor = 0;
}
}else{
outFile << bit;
}
}
但有了这个功能,我一个字也写不出来。有什么建议吗?
更新:能顺利吗?:
void Encoder::EncodeNode(Node node)
{
if (node.left == &Node::NIL and node.right == &Node::NIL)
{
char c = node.first;
writeBit(1);
for (unsigned short i = 0; i < 8; i++) {
writeBit(c & (1 << (7-i)));
}
}
else
{
writeBit(0);
EncodeNode(*node.left);
EncodeNode(*node.right);
}
}
查看Ezran对您链接的问题的回答(与已接受的答案相反)。这是最有效的方法,也是最简单的方法。您根本不需要对树结构进行编码。您所需要发送的只是每个符号的位数。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- 如何在c++中序列化Huffman树