J'ai un compresseur LZW/décompresseur écrit en C.LZW Décompression 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 un caractère tous deux enregistrés dans une liste comme int.
Ma compression fonctionne mais ma décompression laisse certains caractères.
L'entrée:
<title>Agile</title><body><h1>Agile</h1></body></html>
La sortie que je reçois (notez le manque 'e' et '<'):
<title>Agile</title><body><h1>Agil</h1></body>/html>
C'est le code que j'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 le repérer? Je serais reconnaissant.
Notez que vous devriez essayer d'éviter de compter sur votre compression jusqu'à ce que vous puissiez le décompresser. En d'autres termes, si votre affirmation que «ma compression fonctionne» signifie en réalité «cela réduit votre taille», et c'est tout, vous ne devriez pas exclure un bogue dans ce code pour le moment. –
Ma compression fonctionne en utilisant la décompression de quelqu'un d'autre sur mes travaux de saisie. – Radek
La 8ème ligne -> previousCode = entrée [0]; me semble suspect. Vous appelez appendCharacter() pour la sortie dans decode(), et pourtant ce premier code ne sera jamais présenté à appendCharacter() pour la sortie. En outre, si inputSize est zéro, l'entrée [0] peut être un mauvais déréférencement. – meklarian