【问题标题】:Huffman compress file (Got the tree but can't compress)- Java霍夫曼压缩文件(得到树但不能压缩)- Java
【发布时间】:2014-09-21 14:06:35
【问题描述】:

好的,所以我正在尝试使用 Huffman 树进行文件压缩。

我们得到了运行良好的树,但我们无法弄清楚如何将我们得到的二进制字符串写入文件。

例如我们的树返回:'110',它应该表示这个字节:'00000110'对吗?

如果返回:'11111111 11111110' 它应该是什么意思?我们是否应该以字节为单位写入?

所以问题是我们如何将我们得到的二进制字符串转换成字节以便我们可以将它写入文件?

非常感谢, 阿拉

【问题讨论】:

  • Binary to text in Java 的可能重复项
  • @Smutje 不是。另一个问题是如何从二进制字符串传递到可读文本。我在问如何将我的二进制字符串写为文件文本中的字节。
  • 所以你知道你需要将一个字符串写入一个文本文件但你不能自己搜索?那么 SO 显然不是问的正确地方。
  • @Smutje 我有一个二进制字符串:'110'。我需要将其转换为字节,然后将字节写入文件,以便与原始文件相比,该文件将被压缩。这是将二进制字符串转换为我不理解的字节的一部分。
  • 然后猜猜 SO 搜索“java 二进制字符串字节”的结果:stackoverflow.com/questions/17727310/…

标签: java file compression huffman-code


【解决方案1】:

例如我们的树返回:'110',它应该表示这个字节: '00000110' 对吗?

错了。您应该有一个字节缓冲区,您可以在其中写入您的位。将三位 110 写入字节。 (您将需要决定字节中位排序的约定。)字节中仍有五个未使用的位,所以它就在那里。现在您将 10 写入缓冲区。字节缓冲区现在有 11010 和三个未使用的位。所以它仍然坐着。现在您尝试将 111011 写入字节缓冲区。前三位进入字节缓冲区,给你 11010111。你现在已经填满了缓冲区,所以现在才将你的字节写到文件中。你只剩下 011。自从你写出来之后,你清除了你的字节缓冲区,并从你的最后一个代码中放入剩余的 011。您的字节缓冲区现在有 3 位,还有 5 位未使用。以这种方式继续。

缓冲区不必是一个字节。 16 位或 32 位缓冲区很常见,而且效率更高。只要其中的位为 8 位或更多位,您就写出字节,并将剩余的 0-7 位移到缓冲区的开头。

唯一棘手的部分是最后要做什么,因为您的最后一个字节中可能有未使用的位。您的霍夫曼代码应该有一个结束符号来标记流的结束。然后你知道什么时候应该停止寻找更多的霍夫曼代码。如果您没有结束代码,那么您需要以某种方式确保字节中的剩余位不能是完整的霍夫曼代码,或者您需要以其他方式指示位流结束的位置。

【讨论】:

  • 谢谢,我想我有点明白该怎么做了。所以基本上,我循环遍历所有二进制字符串,并在遇到的二进制字符串的每 8 个“字符”中创建一个新字节。然后我写所有我做的字节?
  • 正确。注意最后一个字节的问题,并确保您有解决方案。
  • 是的,这就是我想要弄清楚的。这并不容易,因为我可以在我的霍夫曼树中使用 1 和 0 的任意组合。
  • 只需将一个符号添加到您正在 Huffman 编码的符号集中。它出现一次,是您的流结束符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多