Aller au contenu principal

10. Algorithme de décodage (Decoding Algorithm)

10. Algorithme de décodage (Decoding Algorithm)​

L'algorithme de décodage (Decoding Algorithm) qui produit les données non compressées est le suivant :

lire la taille de la fenêtre
do
   lire le bit ISLAST
   if ISLAST
      lire le bit ISLASTEMPTY
      if ISLASTEMPTY
         sortir de la boucle
   lire MNIBBLES
   if MNIBBLES est zéro
      vérifier que le bit réservé est zéro
      lire MSKIPLEN
      sauter tous les bits jusqu'à la prochaine limite d'octet
      sauter MSKIPLEN octets
      continuer au prochain méta-bloc
   else
      lire MLEN
   if not ISLAST
      lire le bit ISUNCOMPRESSED
      if ISUNCOMPRESSED
         sauter tous les bits jusqu'à la prochaine limite d'octet
         copier MLEN octets de données compressées comme littéraux
         continuer au prochain méta-bloc

   boucle pour chaque trois catégories de blocs (i = L, I, D)
      lire NBLTYPESi
      if NBLTYPESi >= 2
         lire le code préfixe pour les types de blocs, HTREE_BTYPE_i
         lire le code préfixe pour les comptages de blocs, HTREE_BLEN_i
         lire le comptage de blocs, BLEN_i
         définir le type de bloc, BTYPE_i à 0
         initialiser l'avant-dernier et le dernier type de bloc à 0 et 1
      else
         définir le type de bloc, BTYPE_i à 0
         définir le comptage de blocs, BLEN_i à 16777216
   lire NPOSTFIX et NDIRECT
   lire le tableau des modes de contexte littéraux, CMODE[]
   lire NTREESL
   if NTREESL >= 2
      lire la carte de contexte littérale, CMAPL[]
   else
      remplir CMAPL[] avec des zéros
   lire NTREESD
   if NTREESD >= 2
      lire la carte de contexte de distance, CMAPD[]
   else
      remplir CMAPD[] avec des zéros
   lire le tableau des codes préfixes littéraux, HTREEL[]
   lire le tableau des codes préfixes de longueurs insertion-copie, HTREEI[]
   lire le tableau des codes préfixes de distances, HTREED[]
   do
      if BLEN_I est zéro
         lire le type de bloc en utilisant HTREE_BTYPE_I et définir BTYPE_I
            sauvegarder le type de bloc précédent
         lire le comptage de blocs en utilisant HTREE_BLEN_I et définir BLEN_I
      décrémenter BLEN_I
      lire le symbole de longueur insertion-copie en utilisant HTREEI[BTYPE_I]
      calculer la longueur d'insertion, ILEN, et la longueur de copie, CLEN
      boucle pour ILEN
         if BLEN_L est zéro
            lire le type de bloc en utilisant HTREE_BTYPE_L et définir BTYPE_L
               sauvegarder le type de bloc précédent
            lire le comptage de blocs en utilisant HTREE_BLEN_L et définir BLEN_L
         décrémenter BLEN_L
         rechercher le mode de contexte CMODE[BTYPE_L]
         calculer l'ID de contexte, CIDL à partir des deux derniers octets non compressés
         lire le littéral en utilisant HTREEL[CMAPL[64*BTYPE_L + CIDL]]
         écrire le littéral dans le flux non compressé
      if le nombre d'octets non compressés produits dans la boucle pour
         ce méta-bloc est MLEN, alors sortir de la boucle (dans ce cas,
         la longueur de copie est ignorée et peut avoir n'importe quelle valeur)

      if le code de distance est un zéro implicite du code insertion-copie
         définir la distance arrière à la dernière distance
      else
         if BLEN_D est zéro
            lire le type de bloc en utilisant HTREE_BTYPE_D et définir BTYPE_D
               sauvegarder le type de bloc précédent
            lire le comptage de blocs en utilisant HTREE_BLEN_D et définir BLEN_D
         décrémenter BLEN_D
         calculer l'ID de contexte, CIDD à partir de CLEN
         lire le code de distance en utilisant HTREED[CMAPD[4*BTYPE_D + CIDD]]
         calculer la distance par substitution de code court de distance
         if le code de distance n'est pas zéro,
            et la distance n'est pas une référence au dictionnaire statique,
            pousser la distance dans le tampon circulaire des dernières distances
      if la distance est inférieure à la distance maximale autorisée plus un
         reculer de distance octets dans les données non compressées,
         et copier CLEN octets de cette position vers
         le flux non compressé
      else
         rechercher le mot du dictionnaire statique, transformer le mot comme
         indiqué, et copier le résultat dans le flux non compressé
   while nombre d'octets non compressés pour ce méta-bloc < MLEN
while not ISLAST

Si le flux se termine avant l'achèvement du dernier méta-bloc, alors le flux doit être rejeté comme invalide.

Notez qu'une référence de chaîne dupliquée peut faire référence à une chaîne dans un méta-bloc précédent, c'est-à-dire que la distance arrière peut traverser une ou plusieurs limites de méta-blocs. Cependant, une distance de copie arrière ne fera pas référence au-delà du début du flux non compressé ou de la taille de la fenêtre ; toute distance de ce type est interprétée comme une référence à un mot du dictionnaire statique. Notez également que la chaîne référencée peut chevaucher la position actuelle, par exemple, si les 2 derniers octets décodés ont les valeurs X et Y, une référence de chaîne avec <length = 5, distance = 2> ajoute X,Y,X,Y,X au flux non compressé.


Source : RFC 7932, Section 10
Texte officiel (Official Text) : https://www.rfc-editor.org/rfc/rfc7932.txt