Как записать символы, закодированные Хаффманом, в файл? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь прочитать содержимое файла, а затем записать его в другой файл с кодировкой Хаффмана. Поэтому я создал дерево Хаффмана, в котором каждый узел содержит символ, частоту символа и двоичную строку, представляющую частоту. Что мне трудно понять, так это запись кодированных символов Хаффмана в файл.

Я попытался записать двоичную строку в файл, но понял, что это просто запись строки, а не закодированные данные. Поэтому я затем преобразовал двоичные строки в байты и записал байты в файл, но это просто дало бы мне пустой файл того же размера, что и оригинал. Я чувствую, что что-то упускаю, когда дело доходит до написания файла.

Редактировать: оглянувшись на мой код, я понял, что мое дерево не совсем корректно, и теперь я могу (я думаю) объединить битовую строку, чтобы создать байтовый массив, который я могу записать в файл (Код обновлен, чтобы отразить это). Для моего тестового случая я читаю в тексте 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!");
    }
}

1 Ответ

0 голосов
/ 12 июня 2019
...