9. Format des données compressées (Compressed Data Format)
9. Format des données compressées (Compressed Data Format)
Dans cette section, nous décrivons le format de l'ensemble de données compressées en termes du format des éléments de données individuels décrits dans les sections précédentes.
9.1. Format de l'en-tête du flux (Format of the Stream Header)
L'en-tête du flux (Stream Header) ne contient que le champ suivant :
1..7 bits: WBITS, une valeur dans la plage 10..24, encodée avec le
code de longueur variable suivant (tel qu'il apparaît dans les
données compressées, où les bits sont analysés de droite à gauche) :
Value Bit Pattern
----- -----------
10 0100001
11 0110001
12 1000001
13 1010001
14 1100001
15 1110001
16 0
17 0000001
18 0011
19 0101
20 0111
21 1001
22 1011
23 1101
24 1111
Notez que le motif de bits 0010001 est invalide et ne doit pas
être utilisé.
La taille de la fenêtre glissante (Sliding Window), qui est la valeur maximale de toute distance arrière de référence non-dictionnaire (Non-Dictionary Reference Backward Distance), est donnée par la formule suivante :
window size = (1 << WBITS) - 16
9.2. Format de l'en-tête du méta-bloc (Format of the Meta-Block Header)
Un ensemble de données compressées conforme possède au moins un méta-bloc (Meta-Block). Chaque méta-bloc contient un en-tête avec des informations sur la longueur non compressée du méta-bloc et un bit signalant si le méta-bloc est le dernier. Le format de l'en-tête du méta-bloc est le suivant :
1 bit: ISLAST, défini à 1 si c'est le dernier méta-bloc
1 bit: ISLASTEMPTY, si défini à 1, le méta-bloc est vide ; ce champ
n'est présent que si le bit ISLAST est défini -- s'il est 1,
alors le méta-bloc et le flux brotli se terminent à ce bit,
les bits restants dans le dernier octet du flux compressé étant
remplis de zéros (si les bits de remplissage ne sont pas zéro,
alors le flux doit être rejeté comme invalide)
2 bits: MNIBBLES, nombre de nibbles pour représenter la longueur non
compressée, encodé avec le code de longueur fixe suivant :
Value Bit Pattern
----- -----------
0 11
4 00
5 01
6 10
Si MNIBBLES est 0, le méta-bloc est vide, c'est-à-dire qu'il ne
génère aucune donnée non compressée. Dans ce cas, le reste du
méta-bloc a le format suivant :
1 bit: réservé, doit être zéro
2 bits: MSKIPBYTES, nombre d'octets pour représenter la
longueur des métadonnées
MSKIPBYTES * 8 bits: MSKIPLEN - 1, où MSKIPLEN est le
nombre d'octets de métadonnées ; ce champ n'est
présent que si MSKIPBYTES est positif ; sinon,
MSKIPLEN est 0 (si MSKIPBYTES est supérieur à 1
et que le dernier octet est tout zéros, alors le
flux doit être rejeté comme invalide)
0..7 bits: bits de remplissage jusqu'à la prochaine limite
d'octet, doivent tous être zéros
MSKIPLEN octets de métadonnées, ne faisant pas partie des
données non compressées ou de la fenêtre glissante
MNIBBLES * 4 bits: MLEN - 1, où MLEN est la longueur des données non
compressées du méta-bloc en octets (si MNIBBLES est supérieur
à 4 et que le dernier nibble est tout zéros, alors le flux doit
être rejeté comme invalide)
1 bit: ISUNCOMPRESSED, si défini à 1, tous les bits de données compressées
jusqu'à la prochaine limite d'octet sont ignorés, et le reste du
méta-bloc contient MLEN octets de données littérales ; ce champ
n'est présent que si le bit ISLAST n'est pas défini (si les bits
ignorés ne sont pas tous zéros, le flux doit être rejeté comme
invalide)
1..11 bits: NBLTYPESL, nombre de types de blocs littéraux (Literal Block Types),
encodé avec le code de longueur variable suivant (tel qu'il apparaît
dans les données compressées, où les bits sont analysés de droite à
gauche, donc 0110111 a la valeur 12) :
Value Bit Pattern
----- -----------
1 0
2 0001
3..4 x0011
5..8 xx0101
9..16 xxx0111
17..32 xxxx1001
33..64 xxxxx1011
65..128 xxxxxx1101
129..256 xxxxxxx1111
Code préfixe sur l'alphabet de code de type de bloc pour les types de
blocs littéraux, n'apparaît que si NBLTYPESL >= 2
Code préfixe sur l'alphabet de code de comptage de blocs pour les
comptages de blocs littéraux, n'apparaît que si NBLTYPESL >= 2
Code de comptage de blocs + bits supplémentaires pour le premier
comptage de blocs littéraux, n'apparaît que si NBLTYPESL >= 2
1..11 bits: NBLTYPESI, nombre de types de blocs insertion-copie
(Insert-and-Copy Block Types), encodé avec le même code de
longueur variable que ci-dessus
Code préfixe sur l'alphabet de code de type de bloc pour les types de
blocs insertion-copie, n'apparaît que si NBLTYPESI >= 2
Code préfixe sur l'alphabet de code de comptage de blocs pour les
comptages de blocs insertion-copie, n'apparaît que si NBLTYPESI >= 2
Code de comptage de blocs + bits supplémentaires pour le premier
comptage de blocs insertion-copie, n'apparaît que si NBLTYPESI >= 2
1..11 bits: NBLTYPESD, nombre de types de blocs de distance
(Distance Block Types), encodé avec le même code de longueur
variable que ci-dessus
Code préfixe sur l'alphabet de code de type de bloc pour les types de
blocs de distance, n'apparaît que si NBLTYPESD >= 2
Code préfixe sur l'alphabet de code de comptage de blocs pour les
comptages de blocs de distance, n'apparaît que si NBLTYPESD >= 2
Code de comptage de blocs + bits supplémentaires pour le premier
comptage de blocs de distance, n'apparaît que si NBLTYPESD >= 2
2 bits: NPOSTFIX, paramètre utilisé dans le codage de distance
4 bits: quatre bits les plus significatifs de NDIRECT, pour obtenir la valeur
réelle du paramètre NDIRECT, décalez à gauche ce nombre de quatre bits
de NPOSTFIX bits
NBLTYPESL * 2 bits: mode de contexte pour chaque type de bloc littéral
1..11 bits: NTREESL, nombre d'arbres préfixes littéraux, encodé avec le même
code de longueur variable que NBLTYPESL
Carte de contexte littérale, encodée comme décrit dans la section 7.3,
n'apparaît que si NTREESL >= 2 ; sinon, la carte de contexte n'a
que des valeurs nulles
1..11 bits: NTREESD, nombre d'arbres préfixes de distance, encodé avec le
même code de longueur variable que NBLTYPESD
Carte de contexte de distance, encodée comme décrit dans la section 7.3,
n'apparaît que si NTREESD >= 2 ; sinon, la carte de contexte n'a
que des valeurs nulles
NTREESL codes préfixes pour les littéraux
NBLTYPESI codes préfixes pour les longueurs insertion-copie
NTREESD codes préfixes pour les distances
9.3. Format des données du méta-bloc (Format of the Meta-Block Data)
La partie de données compressées d'un méta-bloc consiste en une série de commandes (Commands). Chaque commande a le format suivant :
Code de type de bloc pour le prochain type de bloc insertion-copie,
n'apparaît que si NBLTYPESI >= 2 et que le comptage de blocs insertion-
copie précédent est zéro
Code de comptage de blocs + bits supplémentaires pour le prochain comptage
de blocs insertion-copie, n'apparaît que si NBLTYPESI >= 2 et que le
comptage de blocs insertion-copie précédent est zéro
Longueur insertion-copie, encodée comme dans la section 5, en utilisant le
code préfixe de longueur insertion-copie avec l'index de type de bloc
insertion-copie actuel
Nombre de littéraux de longueur d'insertion, avec le format suivant :
Code de type de bloc pour le prochain type de bloc littéral, n'apparaît
que si NBLTYPESL >= 2 et que le comptage de blocs littéraux précédent
est zéro
Code de comptage de blocs + bits supplémentaires pour le prochain
comptage de blocs littéraux, n'apparaît que si NBLTYPESL >= 2 et que
le comptage de blocs littéraux précédent est zéro
Prochain octet des données non compressées, encodé avec le code préfixe
littéral avec l'index déterminé par les deux octets précédents des
données non compressées, le type de bloc littéral actuel et la carte
de contexte, comme décrit dans la section 7.3
Code de type de bloc pour le prochain type de bloc de distance, n'apparaît
que si NBLTYPESD >= 2 et que le comptage de blocs de distance précédent
est zéro
Code de comptage de blocs + bits supplémentaires pour le prochain comptage
de blocs de distance, n'apparaît que si NBLTYPESD >= 2 et que le comptage
de blocs de distance précédent est zéro
Code de distance, encodé comme dans la section 4, en utilisant le code
préfixe de distance avec l'index déterminé par la longueur de copie, le
type de bloc de distance actuel et la carte de contexte de distance,
comme décrit dans la section 7.3, n'apparaît que si le code de distance
n'est pas un 0 implicite, comme indiqué par le code de longueur
insertion-copie
Le nombre de commandes dans le méta-bloc est tel que la somme des octets non compressés produits (c'est-à-dire le nombre de littéraux insérés plus le nombre d'octets copiés à partir de données passées ou générés à partir du dictionnaire statique) sur toutes les commandes donne la longueur non compressée MLEN encodée dans l'en-tête du méta-bloc.
Si le nombre total d'octets non compressés produits après la partie insertion de la dernière commande est égal à MLEN, alors la longueur de copie de la dernière commande est ignorée et ne produira aucune sortie non compressée. Dans ce cas, la longueur de copie de la dernière commande peut avoir n'importe quelle valeur. Dans tout autre cas, si le nombre de littéraux à insérer, la longueur de copie ou la longueur de mot de dictionnaire résultante causerait le dépassement de MLEN, alors le flux doit être rejeté comme invalide.
Si la dernière commande du dernier méta-bloc non vide ne se termine pas sur une limite d'octet, les bits inutilisés dans le dernier octet doivent être des zéros.
Source : RFC 7932, Section 9
Texte officiel (Official Text) : https://www.rfc-editor.org/rfc/rfc7932.txt