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

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

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

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

Вход:

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

Вывод, который я получаю (обратите внимание на отсутствующие буквы «e» и «‹»):

<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;
}

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


person Radek    schedule 02.12.2009    source источник
comment
Обратите внимание, что вам следует стараться не полагаться на сжатие, пока вы не сможете его распаковать. Другими словами, если ваше заявление о том, что мое сжатие работает, на самом деле означает, что оно уменьшает ваш размер, и все, вы не должны пока исключать ошибку в этом коде.   -  person Lasse V. Karlsen    schedule 02.12.2009
comment
Мое сжатие работает так же, как и использование чужой декомпрессии на моем входе.   -  person Radek    schedule 02.12.2009
comment
8-я строка -> предыдущаяКод = input[0]; мне кажется подозрительным. Вы вызываете appendCharacter() для вывода в decode(), но этот первый код никогда не будет представлен в appendCharacter() для вывода. Кроме того, если inputSize равен нулю, input[0] может быть неверным разыменованием.   -  person meklarian    schedule 02.12.2009
comment
Есть ли причина, по которой вы не можете выполнить код с помощью отладчика, чтобы увидеть, почему эти символы пропускаются?   -  person Wim Coenen    schedule 02.12.2009


Ответы (1)


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

...
firstChar = decode(currentCode);
dictionaryAdd(previousCode, firstChar, nextCode++);
previousCode = currentCode;
...
person interjay    schedule 02.12.2009
comment
Идеальный интерджей, теперь я понимаю, почему я это сделал! Хорошей вам кармы :) - person Radek; 02.12.2009