【发布时间】:2019-06-10 21:44:43
【问题描述】:
我正在尝试读取文件的内容,然后使用 Huffman 编码将它们写入另一个文件。所以我创建了一个霍夫曼树,每个节点都包含字符、字符的频率以及表示频率的二进制字符串。我无法理解的是将霍夫曼编码字符写入文件。
我尝试将二进制字符串写入文件,但意识到它只是写入字符串,而不是实际的编码数据。所以我然后将二进制字符串转换为字节并将字节写入文件,但这只会给我一个与原始文件大小相同的空白文件。在实际编写文件时,我觉得我错过了一些东西。
编辑:回顾我的代码后,我意识到我的树并不完全正确,我现在可以(我认为)将位字符串组合在一起以创建一个字节数组,我可以将其写入文件(更新代码以反映这一点)。对于我的测试用例,我正在阅读文本AAA_BB_C,但是当我查看文件时,输出是<0x1e>。我不确定这意味着什么。我期待与原始文件相同的输出,只是尺寸更小。
public static void writeFile(HuffTree tree) {
String bin = ""; // String of entire binary code
int spot = 0; // Spot in array
byte[] bytes = new byte[256]; // byte array
try {
FloatileWriter writer = new FileWriter("test(encoded).txt");
// Gets Binary String of each Character in the file
for(int i = 0; i < fileText.length(); i++) {
bin += tree.findDataBinary(fileText.charAt(i));
}
// Takes each bit and adds to byte array
System.out.println(bin);
while(bin.length() > 7) {
String temp = bin.substring(0, 7);
bin = bin.substring(7, bin.length());
bytes[spot] = Byte.parseByte(temp, 2);
spot++;
}
// Writes bytes to file
for(int i = 0; i <= spot; i++) {
writer.write(bytes[i]);
}
writer.close();
} catch(IOException e) {
System.out.println("IOException!");
}
}
【问题讨论】:
-
什么是
fileText? ---map有什么意义? ---byte是一个 primitive 并且没有任何方法,那么您希望tempByte.array()做什么呢?创建一个 1 字节数组? --- 您的代码似乎只是将每个字符映射到一个 1 字节的值,所以没有太多的数据 compression 进行。似乎你错过了霍夫曼的全部观点。你确定你了解霍夫曼的工作原理吗?它适用于位。所以你需要做位操作。 -
fileText 是从文件中输入的文本。这是我在阅读时保存的。我在概念上难以理解编码实际发生的位置。一旦我有了与每个字符相关联的正确二进制值,我就不确定该怎么做。该映射是我尝试将与字符关联的二进制值(以字节形式)配对,然后将字节与映射一起写入文件。
-
findDataBinary()的返回值是多少?大概是String,因为这是parseByte()所要求的,但它是像"10011"这样的位串吗?如果是这样,那么调用parseByte()将其转换为十进制 数字10011 似乎毫无意义。您是否至少不想将其解析为二进制文件,例如基地2? ---假设第一个字母映射到111,第二个字母映射到10011,这意味着它们组合映射到11110011,这是8位,因此是一个字节,将2个字母压缩成1 个字节,但您不合并位。退后一步再试一次 -
Yes
findDataBinary()返回一个字符的位串。我的字节数组现在也应该可以正常工作了。但我还是卡住了。 -
“我期待与原始文件相同的输出,只是尺寸更小” 你到底为什么希望将文本文件压缩成二进制文件“相同的输出”?
标签: java huffman-code