LZW декомпрессия в C - PullRequest
       14

LZW декомпрессия в C

2 голосов
/ 02 декабря 2009

У меня есть компрессор / декомпрессор LZW, написанный на C.

Исходная таблица состоит из символов ASCII, а затем каждая теперь строка для сохранения в таблицу состоит из префикса и символа , оба сохраняются в списке как int.

Мое сжатие работает, но моя декомпрессия пропускает некоторые символы.

Ввод:

<title>Agile</title><body><h1>Agile</h1></body></html>

Вывод, который я получаю (обратите внимание на пропущенные 'e' и '<'): </p>

<title>Agile</title><body><h1>Agil</h1></body>/html>

Это код, который я использую (соответствующая часть):

void expand(int * input, int inputSize) {    
    // int prevcode, currcode
    int previousCode; int currentCode;
    int nextCode = 256; // start with the same dictionary of 255 characters
    dictionaryInit();

    // prevcode = read in a code
    previousCode = input[0];

    int pointer = 1;

    // while (there is still data to read)
    while (pointer < inputSize) {
        // currcode = read in a code
        currentCode = input[pointer++];

        if (currentCode >= nextCode) printf("!"); // XXX not yet implemented!
        currentCode = decode(currentCode);

        // add a new code to the string table
        dictionaryAdd(previousCode, currentCode, nextCode++);

        // prevcode = currcode
        previousCode = currentCode;
    }
}

int decode(int code) {
    int character; int temp;

    if (code > 255) { // decode
        character = dictionaryCharacter(code);
        temp = decode(dictionaryPrefix(code)); // recursion
    } else {
        character = code; // ASCII
        temp = code;
    }
    appendCharacter(character); // save to output
    return temp;
}

Вы можете это заметить? Я был бы благодарен.

1 Ответ

4 голосов
/ 02 декабря 2009

Ваша функция декодирования возвращает первый символ в строке. Вам нужен этот символ, чтобы добавить его в словарь, но вы должны , а не установить previousCode. Итак, ваш код должен выглядеть так:

...
firstChar = decode(currentCode);
dictionaryAdd(previousCode, firstChar, nextCode++);
previousCode = currentCode;
...
...