Aller au contenu principal

6. Encodage des commandes de changement de bloc (Encoding of Block-Switch Commands)

6. Encodage des commandes de changement de bloc (Encoding of Block-Switch Commands)

Comme décrit dans la section 2, une commande de changement de bloc (Block-Switch Command) est une paire <block type, block count>. Celles-ci sont encodées dans la partie données compressées du méta-bloc, juste avant le début de chaque nouveau bloc d'une catégorie de bloc particulière.

Chaque type de bloc (Block Type) dans les données compressées est représenté par un code de type de bloc (Block Type Code), encodé en utilisant un code préfixe sur l'alphabet des codes de type de bloc. Un symbole de type de bloc 0 signifie que le nouveau type de bloc est le même que le type du bloc précédent de la même catégorie de bloc, c'est-à-dire le type de bloc qui précédait le type actuel, tandis qu'un symbole de type de bloc 1 signifie que le nouveau type de bloc est égal au type de bloc actuel plus un. Si le type de bloc actuel est le maximum possible, alors un symbole de type de bloc de 1 entraîne un retour à un nouveau type de bloc de 0. Les symboles de type de bloc 2..257 représentent respectivement les types de bloc 0..255. Les types de bloc précédent et actuel sont initialisés respectivement à 1 et 0, à la fin de l'en-tête du méta-bloc.

Puisque le premier type de bloc de chaque catégorie de bloc est 0, le type de bloc de la première commande de changement de bloc n'est pas encodé dans les données compressées. Si une catégorie de bloc n'a qu'un seul type de bloc, le compteur de blocs (Block Count) de la première commande de changement de bloc est également omis des données compressées ; sinon, il est encodé dans l'en-tête du méta-bloc.

Puisque la fin du méta-bloc est détectée par le nombre d'octets non compressés produits, les compteurs de blocs pour n'importe laquelle des trois catégories n'ont pas besoin de compter jusqu'à exactement zéro à la fin du méta-bloc.

Le nombre de types de blocs différents dans chaque catégorie de bloc, désigné par NBLTYPESL, NBLTYPESI et NBLTYPESD pour les littéraux, les longueurs d'insertion et de copie, et les distances, respectivement, est encodé dans l'en-tête du méta-bloc, et il doit être égal au plus grand type de bloc plus un dans cette catégorie de bloc. En d'autres termes, l'ensemble des types de blocs littéraux, de longueurs d'insertion et de copie, et de distances doit être respectivement [0..NBLTYPESL-1], [0..NBLTYPESI-1] et [0..NBLTYPESD-1]. Il s'ensuit que la taille de l'alphabet des codes de type de bloc littéraux, de longueurs d'insertion et de copie, et de distances est respectivement NBLTYPESL + 2, NBLTYPESI + 2 et NBLTYPESD + 2.

Chaque compteur de blocs dans les données compressées est représenté par une paire <block count code, extra bits>. Le code de compteur de blocs (Block Count Code) et les bits supplémentaires (Extra Bits) sont encodés dos à dos, le code de compteur de blocs est encodé en utilisant un code préfixe sur l'alphabet des codes de compteur de blocs, tandis que la valeur des bits supplémentaires est encodée comme une valeur entière de largeur fixe. Le nombre de bits supplémentaires peut être 0..24, et il dépend du code de compteur de blocs.

Les symboles de l'alphabet des codes de compteur de blocs ainsi que le nombre de bits supplémentaires et la plage des compteurs de blocs sont les suivants :

        Extra              Extra               Extra
Code Bits Lengths Code Bits Lengths Code Bits Lengths
---- ---- ------- ---- ---- ------- ---- ---- -------
0 2 1..4 9 4 65..80 18 7 369..496
1 2 5..8 10 4 81..96 19 8 497..752
2 2 9..12 11 4 97..112 20 9 753..1264
3 2 13..16 12 5 113..144 21 10 1265..2288
4 3 17..24 13 5 145..176 22 11 2289..4336
5 3 25..32 14 5 177..208 23 12 4337..8432
6 3 33..40 15 5 209..240 24 13 8433..16624
7 3 41..48 16 6 241..304 25 24 16625..16793840
8 4 49..64 17 6 305..368

La première commande de changement de bloc de chaque catégorie de bloc est spéciale en ce sens qu'elle est encodée dans l'en-tête du méta-bloc, et comme décrit précédemment, le code de type de bloc est omis car il est implicitement zéro.


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