[英]Huffman compress file (Got the tree but can't compress)- Java
好吧,所以我试图使用霍夫曼树进行文件压缩。
我们得到了运行良好的树,但无法弄清楚如何将获取的二进制字符串写入文件中。
因此,例如,我们的树返回:“ 110”,应表示该字节:“ 00000110”对吗?
并且如果返回:'11111111 11111110',则应表示什么? 我们应该以字节为单位写吗?
因此,问题是如何将获取的二进制字符串转换为字节,以便可以将其写入文件中?
非常感谢,阿拉
因此,例如,我们的树返回:“ 110”,应表示该字节:“ 00000110”对吗?
错误。 您应该有一个位的字节缓冲区,可以在其中写入位。 将三个位110写入字节。 (您将需要确定字节中位排序的约定。)您仍然在字节中有五个未使用的位,因此位于此处。 现在,您将10写入缓冲区。 字节缓冲区现在具有11010和三个未使用的位。 所以它仍然坐着。 现在,您尝试将111011写入字节缓冲区。 前三位进入字节缓冲区,为您提供11010111。您现在已填满了缓冲区,因此仅现在才将字节写到文件中。 您将剩下011。自从将其写出后,便清除了位的字节缓冲区,并从上一个代码中放入了剩余的011。 现在,字节缓冲区中有3位,还有5位未使用。 以这种方式继续。
缓冲区不必是一个字节。 16位或32位缓冲区很常见,效率更高。 只要其中的位为八位或更多,就写出字节,然后将剩余的0-7位移到缓冲区的开头。
唯一棘手的部分是最后要做什么,因为最后一个字节中可能有未使用的位。 您的霍夫曼代码应带有结束符号,以标记流的结尾。 然后,您知道何时应该停止寻找更多的霍夫曼代码。 如果没有结束码,则需要以某种方式确保字节中的其余位不能是完整的霍夫曼码,或者需要以其他方式指示位流的结束位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.