C# 哈夫曼编码。从二进制文件解码

C# 哈夫曼编码。从二进制文件解码,c#,C#,哈夫曼编码任务 我在做什么。 从文件中读取字符串,准备哈夫曼结构,将字符串编码为位,并将该位保存到二进制文件中 我需要的是: 从二进制文件解码字符串,但编码和解码必须是独立的。关闭e.q的应用程序后 我会像这样保存到二进制文件: A:000;l:001;a:10; :110;m:010;k:011;o:1110;t:1111; 00000110110010101100111110111110; 需要阅读和解码。所以我想我需要重新构建哈夫曼结构,但是如何呢 因为你知道A:000;l:001;a:

哈夫曼编码任务

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

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

我会像这样保存到二进制文件:

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

需要阅读和解码。所以我想我需要重新构建哈夫曼结构,但是如何呢

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

希望这有帮助。

我看到了这些选项

  • 编码器和解码器总是使用同一棵树,它从不改变。所以解码器已经知道,
    000
    意味着
    A
  • 树以二进制格式附加在消息之前。编码器和解码器必须知道存储树的确切格式,有很多方法可以做到这一点。在最简单的情况下,将有编码字符的数量和每个字符的ascii码,哈夫曼码的长度和代码本身
  • 树是使用自适应哈夫曼编码动态构建的,但它似乎不是您的情况
假设“自适应哈夫曼”,通常不需要自己决定每个字符使用什么代码

通常的顺序是

  • 分析要编码的文本。这意味着计算每个字符的出现次数。例如,在英语中,“e”比“x”、“y”或“z”更频繁
  • 按升序对字符/出现的数组进行排序
  • 构建一个BTree-这意味着将两个最低的节点组合起来,添加它们的计数并创建一个新的树节点。忽略这两个,然后查找下一对最低出现次数(可能包括刚才创建的节点)。这将一直持续到您最终得到一个具有一个根的BTree。(这方面有很多有用的图片)。如有必要,我可以更详细地解释这一点
  • 你从树根“走”到每一片叶子。为每个“左”添加一个“0”,为每个右添加一个“1”。当你到达那片叶子时,你就有了那封信的密码。如果你的文本有多个e,它将有最短的代码,没有其他代码将以相同的位序列开始。这就是想法,最频繁的字符有最短的代码,从而更大的内存节省
  • 现在,通过遍历树,您可以获得每个字符的代码(不同长度)
  • 将文本编码为一串位
  • 要解码,请使用同一棵树。你说它必须在“关闭应用程序后”工作,所以你必须用编码数据以某种形式存储树
    在你的评论中,你提到了不同长度代码的问题。没有含糊不清的地方。在极端情况下,如果你的e比所有其他角色加起来都多,那么这棵树就会非常不平衡“e”将被编码为“1”,而所有其他字母将具有不同长度的代码,从0开始

    是的,谢谢你的帮助!我会工作的。但我有二进制文件中的代码,它是:0101010101110101010101010。我需要找到A是000。“A”,“A:”和“;”有不同的长度代码。这有用吗?如果需要,我可以更详细地介绍步骤3。我用哈夫曼在内存有限的嵌入式软件中为“标签”节省空间。