好吧,我正在尝试使用Huffman树进行文件压缩。
我们得到了正常工作的树,但我们无法弄清楚如何编写我们进入文件的二进制字符串。
例如,我们的树返回:' 110',它应该表示这个字节:' 00000110'正确?
如果退货:' 11111111 11111110'它应该是什么意思?我们应该用字节写吗?
所以问题是我们如何将我们得到的二进制字符串转换成字节,以便我们可以将它写在文件上?
非常感谢, ARA
答案 0 :(得分:1)
例如,我们的树返回:' 110',它应该表示这个字节: ' 00000110'正确?
错误。你应该有一个位的字节缓冲区,你可以写入你的位。将三位110写入字节。 (您需要决定字节中位排序的约定。)字节中仍然有五个未使用的位,因此它就位。现在你将10写入缓冲区。字节缓冲区现在有11010和三个未使用的位。所以它仍然存在。现在您尝试将111011写入字节缓冲区。前三位进入字节缓冲区,给你11010111.你现在已经填满了缓冲区,所以现在才把你的字节写到文件中。你留下了011.你自写完之后就清除了你的字节缓冲区,然后从你上一个代码中输入剩余的011。您的字节缓冲区现在有三位,未使用五位。以这种方式继续。
缓冲区不必是一个字节。 16位或32位缓冲区很常见,效率更高。只要其中的位为8或更多,就会写出字节,并将剩余的0-7位移位到缓冲区的起始位置。
唯一棘手的部分是最后要做什么,因为你的最后一个字节可能有未使用的位。您的霍夫曼代码应该有一个结束符号来标记流的结尾。然后你知道什么时候应该停止寻找更多的霍夫曼代码。如果你没有结束代码,那么你需要确保字节中的其余位不能是完整的霍夫曼代码,或者你需要以某种其他方式指示位流的结束。