霍夫曼编码.从二进制文件解码
本文关键字:解码 二进制文件 编码 霍夫曼 | 更新日期: 2023-09-27 18:30:40
霍夫曼编码任务。
我在做什么。从文件中读取字符串,准备霍夫曼结构,将字符串编码为位并将该位保存到二进制文件中。
我需要什么:从二进制文件解码字符串,但编码和解码必须是独立的。关闭应用程序后 e.q.
我像这样保存到二进制文件:
A:000;l:001;a:10; :110;m:010;k:011;o:1110;t:1111;
00000110110010101100111110111110;
并且需要阅读和解码。所以我认为我需要从中再次建立霍夫曼结构,但如何?
我看到这个选项
- 编码器和解码器始终使用相同的树,它永远不会改变。所以解码器已经知道,
000
意味着A
. - 树以二进制格式追加在消息之前。编码器和解码器必须知道存储树的确切格式,有很多可能性可以做到这一点。在最简单的情况下,将有编码字符的数量,每个字符的ascii代码,霍夫曼代码的长度和代码本身。
- 树是使用自适应霍夫曼编码动态构建的,但似乎不是您的情况。
既然你知道A:000;l:001;a:10; :110;m:010;k:011;o:1110;t:1111;
您可以尝试一次遍历字符串00000110110010101100111110111110
一个字符。 每个字符及其代码都有一个 switch 语句。当您遇到情况时,例如000
,您可以输出 A。这是我可以看到你能够回到字符串的一种方式。我相信有更好的出路。
希望这有帮助。
假设"自适应霍夫曼",通常不会自己决定为每个字符使用什么代码。
通常的顺序是
- 分析要编码的文本。这意味着计算每个字符的出现次数。例如,在英语中,"e"比"x","y"或"z"更常见。
- 按升序对字符/出现数组进行排序。
- 构建一个 BTree - 这意味着将两个最低的合并,添加它们的计数并创建一个新的树节点。忽略这两个并查找下一对最低匹配项(可能包括您刚刚创建的节点)。这种情况一直持续到您最终得到一个根的 BTree。(有很多有用的图像)。如有必要,我可以通过更详细的步骤来解释这一点。
- 从树根"走"到每片叶子。对于每个"左",添加一个"0",对于每个右边添加一个"1"。当你到达叶子时,你就有了那个字母的代码。如果你的文本有很多 e,它将有最短的代码,没有其他代码会以相同的位序列开头。这就是这个想法,最常见的字符具有最短的代码,因此可以节省更大的内存。
- 现在,通过走树,你得到了每个字符的代码(不同的长度)。
- 将文本编码为一串位。
- 要解码,请使用同一棵树。您说它必须在"关闭应用程序后"工作,因此您必须以某种形式将树与编码数据一起存储。
在您的评论中,您提到了具有不同长度代码的问题。没有歧义。在极端情况下,如果你的 e 比所有其他字符的总和还要多,那么树就会非常不平衡。"e"将被编码为"1",所有其他字母将具有不同长度的代码,从0开始。