【问题标题】:How do I write Huffman encoded characters to a file?如何将霍夫曼编码字符写入文件?
【发布时间】: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


【解决方案1】:
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多