我在编程课上练习霍夫曼编码。我已经完成了几乎所有的编码部分。例如,我为每个字符分配了一个代码(即a = 100100),并根据它的代码转换文本中的每个字符。然后我将每个代码解析为Byte列表,就像将100100解析为Byte并将其存储到List中一样。但是,我需要将所有字节写入.txt文件。我意识到有一个问题。
示例:一个字符的代码为" 1001"它将作为1个字节而不是4个字节写入.txt文件。
我知道在霍夫曼编码之后,字符以如下格式存储: " 11100111101011111101011011111000010000101" 但现在我的情况是每个字符占用1个字节的大小,在编码之前与原始输入文件的大小没有差别。
有没有办法以" 11100111101011111101011011111000010000101"等格式存储代码?
对不起我的英语,我尽力解释我的困惑。
答案 0 :(得分:0)
try (FileWriter fw = new FileWriter("out.txt")) {
try (BufferedWriter bfw = new BufferedWriter(fw)) {
char[] buffer = str.toCharArray();
for (int i = 0; i < buffer.length; i++) {
bfw.write(Integer.valueOf(Byte.valueOf((byte) buffer[i]).intValue()).toBinaryString());
}
}
}
答案 1 :(得分:0)
如果您打算将所有位保留在内存中,则可以使用BitSet bits = new BitSet();
bits.set(7000, true);
if (bits.get(7000)) { ... }
byte[] bytes = bits.toByteArray();
Path path = Paths.get("C:/Temp/huffman.bin");
Files.writeBytes(path, bytes);
对象。
{{1}}
立即使用字节是可行的。
但你不能写字母;有一种转变会让事情变得混乱。 Mind char是16位UTF-16格式,包含Unicode。
这会写二进制数据,而不是文本。
对于尾随比特,我不知道霍夫曼如何处理这个问题,做一些研究;我认为位0将会产生并且不会产生伪像。也许添加前0-7位较长的代码。 填充是关键词。