java 如何写霍夫曼代码到二进制文件?

dhxwm5r4  于 2023-01-15  发布在  Java
关注(0)|答案(2)|浏览(132)

我有一个.txt示例文件,我想使用霍夫曼编码进行压缩。我的问题是,如果一个字符的大小是一个字节,而您可以写入的最小大小是一个字节,如何减小示例文件的大小?
我把样本文件转换成霍夫曼编码,写入一个新的空的.txt文件中,这个文件只有0和1组成一行字符,然后我把这个新文件用Java中的BitSet类一点一点地写入一个二进制文件中,如果这个新文件中的字符是0或1,我写了0或1分别到二进制文件。这个过程非常慢,它崩溃了我的电脑多次,我希望有人有一个更有效的解决方案。我已经写了我所有的代码在Java中。

yptwkmov

yptwkmov1#

一种方法是使用BitSet设置表示计算代码的位,然后可以使用BitSet.toByteArray()BitSet.toLongArray()并写出信息,这两种方法都以little endian编码存储位。

2w2cym1i

2w2cym1i2#

不要将"0""1"字符写入文件。将01 * 位 * 写入文件。
要做到这一点,可以使用shift(<<)和or(|)操作符将8位累加到字节缓冲区中,然后将该字节写入文件。重复以上步骤。最后,字节缓冲区中的字节可能少于8位。如果是这样,则将该字节写入文件,剩余的位将填充为零。
例如int buf = 0, count = 0;,对于每个位:buf |= bit << count++;,检查是否有8个:if (count == 8) { out.writeByte(buf); buf = count = 0; }。在结尾,if (count > 0) out.writeByte(buf);
解码霍夫曼码时,您可能会遇到最后一个字节中的填充零位的问题。它们可能会被解码为无关符号。为了处理此问题,您需要让解码器知道何时停止,方法是在霍夫曼码之前发送符号数,或者添加流结束符号。

相关问题