霍夫曼编码。从二进制文件解码

时间:2016-01-17 16:34:44

标签: c#

霍夫曼编码任务。

我正在做什么。 从文件中读取字符串,准备Huffman结构,将字符串编码为位并将这些位保存到二进制文件。

我需要什么: 从二进制文件解码字符串,但编码和解码必须是独立的。关闭e.q。

的应用程序后

我保存到二进制文件:

A:000;l:001;a:10; :110;m:010;k:011;o:1110;t:1111;
00000110110010101100111110111110;

需要阅读并解码。所以我认为我需要再次建立霍夫曼结构,但是如何?

3 个答案:

答案 0 :(得分:0)

因为您知道A:000;l:001;a:10; :110;m:010;k:011;o:1110;t:1111;您可以尝试一次遍历字符串00000110110010101100111110111110。还为每个字符及其代码都有一个switch语句。当你遇到一个案例时,例如000,你可以输出A.这是我可以看到你能够回到字符串的一种方式。我相信有更好的方法。

希望这会有所帮助。

答案 1 :(得分:0)

我看到了这个选项

  • 编码器和解码器总是使用相同的树,它永远不会改变。所以解码器已经知道,000表示A
  • 树以二进制格式附加在邮件之前。编码器和解码器必须知道存储树的确切格式,如何做到这一点有很多可能性。在最简单的情况下,会有许多编码字符,每个字符都有ascii代码,霍夫曼代码长度和代码本身。
  • 树是使用自适应霍夫曼编码动态构建的,但它似乎不是你的情况。

答案 2 :(得分:0)

假设"自适应霍夫曼",通常不会自己决定每个角色使用什么代码。

通常的顺序是

  1. 分析要编码的文本。这意味着计算每个角色的出现次数。用英语' e'会更频繁地比' x',' y'或者' z'例如。
  2. 按升序对char / occurrence数组进行排序。
  3. 构建一个BTree - 这意味着将两个最低点合并,添加它们的计数并创建一个新的树节点。忽略这两个并查找下一对最低出现次数(可能包括您刚刚创建的节点)。这一直持续到你最终得到一个带有一个根的BTree。 (有很多有用的图像)。如有必要,我可以通过更详细的步骤解释这一点。
  4. 从树的根部,你走路"每片叶子。对于每个"左"添加' 0' 0并为每个权利a' 1'。当你到达叶子时,你有那封信的代码。如果您的文本有很多,那么它将具有最短的代码,并且没有其他代码将以相同的位序列开始。这是一个想法,最常见的字符具有最短的代码,从而节省更多的内存。
  5. 现在,通过走树,您可以获得每个角色的代码(不同长度)。
  6. 将文字编码为一串位。
  7. 要解码,请使用同一棵树。你说它必须工作"关闭app"所以你必须用编码数据以某种形式存储树。
  8. 在您的评论中,您提到了使用不同长度代码的问题。没有含糊之处。在一个极端的情况下,如果你有比其他所有字符组合更多的e,那么这棵树就会非常不平衡。 ' E'将被编码为' 1'所有其他字母都有不同长度的代码,从0开始。