LZW Decompression en C
-
11-09-2019 - |
Question
I ai un compresseur LZW / décompresseur écrit en C.
Le tableau initial se compose de caractères ASCII et chaque maintenant chaîne à enregistrer dans la table se compose d'un préfixe et caractère à la fois enregistré dans une liste int.
Mes travaux de compression mais ma décompression laisse certains caractères sur.
L'entrée:
<title>Agile</title><body><h1>Agile</h1></body></html>
La sortie je reçois (notez le manque 'e' et '<'):
<title>Agile</title><body><h1>Agil</h1></body>/html>
Ceci est le code que je l'utilise (la partie pertinente):
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;
}
Pouvez-vous repérer? Je serais reconnaissant.
La solution
Votre fonction de décodage renvoie le premier caractère de la chaîne. Vous avez besoin ce personnage afin de l'ajouter au dictionnaire, mais vous devez pas Déf previousCode
à lui. Donc, votre code devrait ressembler à:
...
firstChar = decode(currentCode);
dictionaryAdd(previousCode, firstChar, nextCode++);
previousCode = currentCode;
...