Дополнительные байты добавляются, когда я запускаю сжатый файл в моем методе распаковки - PullRequest
0 голосов
/ 14 октября 2019

Я работаю с текстовыми файлами здесь. Кажется, моя декомпрессия LZW работает неправильно. Что-то не так, когда я пытаюсь распаковать сжатый файл обратно: я получаю дополнительные байты , добавленные в текстовый файл после распаковки. На данный момент я обнаружил последовательность значений, которая вызывает проблему, это * (символ звезды)

Например, когда у меня есть текстовый файл, содержащий следующее предложение:

*** Hello ***

Вот как работает моя декомпрессия (я показываю только 2 итерации):

#1 iteration
priorword = 42
currword = 256
Added in dict: 256: ** 

Wrote in file: **

#2 iteration
priorword = 256
currword = 32
Added in dict: 257: **_     (_ means space)
Write in file: **


We know have in file: ****_

Что может быть не так, добавляется дополнительная звезда, потому что, как вы видите, исходный файл имеет три звезды.

После распаковки, I get: **** Hello **

Звезда * справа добавляется слева, как это может быть?

Метод декомпрессии:

public void LZW_Decompress(String input) throws IOException {
        // DictSize builds up to 4k, Array_Char holds these values
        Array_char = new String[4096];

        for (int i = 0; i < 256; i++) {
            dictionary.put(i, Character.toString((char) i));
            Array_char[i] = Character.toString((char) i);
        }

        // Read input as uncompressed file & Write out compressed file
        RandomAccessFile in = new RandomAccessFile(input, "r");
        RandomAccessFile out = new RandomAccessFile(input.replace(
                ".lzw", ""), "rw");

        try {
            // Gets the first word in code and outputs its corresponding char
            buffer[0] = in.readByte();
            buffer[1] = in.readByte();
            priorword = getvalue(buffer[0], buffer[1], onleft);
            onleft = !onleft;
            out.writeBytes(Array_char[priorword]);

            // Reads every 3 bytes and generates corresponding characters
            while (true) {
                if (onleft) {
                    buffer[0] = in.readByte();
                    buffer[1] = in.readByte();
                    currword = getvalue(buffer[0], buffer[1], onleft);
                } else {
                    buffer[2] = in.readByte();
                    currword = getvalue(buffer[1], buffer[2], onleft);
                }
                onleft = !onleft;

                if (currword >= dictSize) {
                    if (dictSize < 4096) {
                        Array_char[dictSize] = Array_char[priorword]
                                + Array_char[priorword].charAt(0);
                    }
                    dictSize++;
                    out.writeBytes(Array_char[priorword]
                            + Array_char[priorword].charAt(0));
                } else {
                    if (dictSize < 4096) {
                        Array_char[dictSize] = Array_char[priorword]
                                + Array_char[currword].charAt(0);
                    }
                    dictSize++;
                    out.writeBytes(Array_char[currword]);
                }
                priorword = currword;
            }
        } catch (EOFException e) {
            in.close();
            out.close();
        }
    }
...