我有一个.txt
示例文件,我想使用霍夫曼编码进行压缩。我的问题是,如果一个字符的大小是一个字节,而您可以写入的最小大小是一个字节,如何减小示例文件的大小?
我把样本文件转换成霍夫曼编码,写入一个新的空的.txt
文件中,这个文件只有0和1组成一行字符,然后我把这个新文件用Java中的BitSet
类一点一点地写入一个二进制文件中,如果这个新文件中的字符是0或1,我写了0或1分别到二进制文件。这个过程非常慢,它崩溃了我的电脑多次,我希望有人有一个更有效的解决方案。我已经写了我所有的代码在Java中。
2条答案
按热度按时间yptwkmov1#
一种方法是使用
BitSet
设置表示计算代码的位,然后可以使用BitSet.toByteArray()
或BitSet.toLongArray()
并写出信息,这两种方法都以little endian
编码存储位。2w2cym1i2#
不要将
"0"
和"1"
字符写入文件。将0
和1
* 位 * 写入文件。要做到这一点,可以使用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);
。解码霍夫曼码时,您可能会遇到最后一个字节中的填充零位的问题。它们可能会被解码为无关符号。为了处理此问题,您需要让解码器知道何时停止,方法是在霍夫曼码之前发送符号数,或者添加流结束符号。