2009-12-02 8 views
1

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.

+1

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. –

+3

Ma compression fonctionne en utilisant la décompression de quelqu'un d'autre sur mes travaux de saisie. – Radek

+1

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

Répondre

4

Votre fonction de décodage renvoie le premier caractère de la chaîne. Vous avez besoin de ce caractère pour pouvoir l'ajouter au dictionnaire, mais vous devez et non y définir previousCode. Donc votre code devrait ressembler à:

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

Interjay parfait, je comprends maintenant pourquoi je l'ai fait! Bon karma à toi :) – Radek

Questions connexes