3.1.1.1. Frame Header (En-tête de trame)
La taille de l'en-tête de trame est variable, minimum 2 octets et maximum 14 octets, selon les paramètres facultatifs. La structure de Frame_Header est la suivante:
+-------------------------+-----------+
|| Frame_Header_Descriptor | 1 byte |
+-------------------------+-----------+
|| [Window_Descriptor] | 0-1 byte |
+-------------------------+-----------+
|| [Dictionary_ID] | 0-4 bytes |
+-------------------------+-----------+
|| [Frame_Content_Size] | 0-8 bytes |
+-------------------------+-----------+
Tableau 2: Structure de Frame_Header
3.1.1.1.1. Frame_Header_Descriptor (Descripteur d'en-tête de trame)
Le premier octet de l'en-tête est appelé Frame_Header_Descriptor. Il décrit quels autres champs sont présents. Le décodage de cet octet suffit pour déterminer la taille de Frame_Header.
| Numéro de bit (Bit Number) | Nom du champ (Field Name) |
|---|---|
| 7-6 | Frame_Content_Size_Flag |
| 5 | Single_Segment_Flag |
| 4 | (inutilisé, unused) |
| 3 | (réservé, reserved) |
| 2 | Content_Checksum_Flag |
| 1-0 | Dictionary_ID_Flag |
Tableau 3: Frame_Header_Descriptor
Dans le tableau 3, le bit 7 est le bit de poids fort et le bit 0 est le bit de poids faible.
3.1.1.1.1.1. Frame_Content_Size_Flag (Indicateur de taille de contenu de trame)
Il s'agit d'un indicateur de 2 bits (équivalent à Frame_Header_Descriptor décalé de 6 bits vers la droite), qui spécifie si Frame_Content_Size (taille des données décompressées) est fourni dans l'en-tête. Frame_Content_Size_Flag fournit FCS_Field_Size, le nombre d'octets utilisés par Frame_Content_Size selon le tableau 4:
| Frame_Content_Size_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| FCS_Field_Size | 0 ou 1 | 2 | 4 | 8 |
Tableau 4: Frame_Content_Size_Flag fournit FCS_Field_Size
Lorsque Frame_Content_Size_Flag est 0, FCS_Field_Size dépend de Single_Segment_Flag: si Single_Segment_Flag est défini, alors FCS_Field_Size est 1. Sinon, FCS_Field_Size est 0; Frame_Content_Size n'est pas fourni.
3.1.1.1.1.2. Single_Segment_Flag (Indicateur de segment unique)
Si cet indicateur est défini, les données doivent être régénérées dans un seul segment de mémoire continu.
Dans ce cas, l'octet Window_Descriptor est ignoré, mais Frame_Content_Size doit être présent. Par conséquent, le décodeur doit allouer un segment de mémoire de taille égale ou supérieure à Frame_Content_Size.
Pour protéger le décodeur contre des demandes de mémoire déraisonnables, il est permis au décodeur de rejeter les trames compressées qui demandent des tailles de mémoire dépassant la plage autorisée du décodeur.
Pour une compatibilité plus large, il est recommandé que les décodeurs prennent en charge au moins une taille de mémoire de 8 Mo. Il ne s'agit que d'une recommandation; chaque décodeur peut librement prendre en charge des limites supérieures ou inférieures en fonction des contraintes locales.
3.1.1.1.1.3. Unused Bit (Bit inutilisé)
Un décodeur conforme à cette version de la spécification ne doit pas interpréter ce bit. Il peut être utilisé dans les versions futures pour représenter des attributs qui ne sont pas essentiels pour décoder correctement la trame. Un encodeur conforme à cette spécification doit définir ce bit à zéro.
3.1.1.1.1.4. Reserved Bit (Bit réservé)
Ce bit est réservé pour une future fonctionnalité. Sa valeur doit être zéro. Un décodeur conforme à cette version de la spécification doit s'assurer qu'il n'est pas défini. Ce bit peut être utilisé dans les révisions futures pour représenter des fonctionnalités qui doivent être interprétées pour décoder correctement la trame.
3.1.1.1.1.5. Content_Checksum_Flag (Indicateur de somme de contrôle du contenu)
Si cet indicateur est défini, une Content_Checksum de 32 bits sera présente à la fin de la trame. Voir la description de Content_Checksum ci-dessus.
3.1.1.1.1.6. Dictionary_ID_Flag (Indicateur d'ID de dictionnaire)
Il s'agit d'un indicateur de 2 bits (= Frame_Header_Descriptor & 0x3), qui indique si un ID de dictionnaire est fourni dans l'en-tête. Il spécifie également la taille de ce champ comme DID_Field_Size:
| Dictionary_ID_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| DID_Field_Size | 0 | 1 | 2 | 4 |
Tableau 5: Dictionary_ID_Flag
3.1.1.1.2. Window Descriptor (Descripteur de fenêtre)
Cela fournit une garantie sur le tampon de mémoire minimum requis pour décompresser la trame. Cette information est importante pour que le décodeur alloue suffisamment de mémoire.
L'octet Window_Descriptor est facultatif. Lorsque Single_Segment_Flag est défini, Window_Descriptor n'est pas présent. Dans ce cas, Window_Size est égal à Frame_Content_Size, et sa valeur peut aller de 0 à 2^64 - 1 octets (16 ExaBytes).
| Numéro de bit (Bit Number) | 7-3 | 2-0 |
|---|---|---|
| Nom du champ (Field Name) | Exponent (Exposant) | Mantissa (Mantisse) |
Tableau 6: Window_Descriptor
La taille minimale du tampon de mémoire est appelée Window_Size. Elle est décrite par la formule suivante:
windowLog = 10 + Exponent;
windowBase = 1 << windowLog;
windowAdd = (windowBase / 8) * Mantissa;
Window_Size = windowBase + windowAdd;
La Window_Size minimale est de 1 Ko. La Window_Size maximale est de (1<<41) + 7*(1<<38) octets, soit 3,75 To.
En général, des valeurs de Window_Size plus grandes ont tendance à améliorer le taux de compression, au prix d'une utilisation accrue de la mémoire.
Pour décoder correctement les données compressées, le décodeur doit allouer un tampon d'au moins Window_Size octets.
Pour protéger le décodeur contre des demandes de mémoire déraisonnables, il est permis au décodeur de rejeter les trames compressées qui demandent des tailles de mémoire dépassant la plage autorisée du décodeur.
Pour améliorer l'interopérabilité, il est recommandé que les décodeurs prennent en charge des valeurs de Window_Size allant jusqu'à 8 Mo et que les encodeurs ne génèrent pas de trames nécessitant une Window_Size supérieure à 8 Mo. Il ne s'agit que d'une recommandation, et les décodeurs peuvent librement prendre en charge des limites supérieures ou inférieures en fonction des contraintes locales.
3.1.1.1.3. Dictionary_ID (ID de dictionnaire)
Il s'agit d'un champ de taille variable qui contient l'ID de dictionnaire requis pour décoder correctement la trame. Ce champ est facultatif. S'il n'est pas présent, c'est au décodeur de décider quel dictionnaire utiliser.
La taille du champ Dictionary_ID est fournie par DID_Field_Size. DID_Field_Size est directement dérivé de la valeur de Dictionary_ID_Flag. Un octet peut représenter les ID 0-255; 2 octets peuvent représenter les ID 0-65535; 4 octets peuvent représenter les ID 0-4294967295. Le format est little-endian.
Il est permis d'utiliser un grand ID de dictionnaire de 4 octets pour représenter un petit ID (par exemple, 13), même si cela est inefficace.
Dans des environnements privés, tout ID de dictionnaire peut être utilisé. Cependant, pour les trames et les dictionnaires distribués dans l'espace public, Dictionary_ID doit être soigneusement attribué. Les plages suivantes sont réservées uniquement aux dictionnaires enregistrés auprès de l'IANA (voir section 7.4):
- Plage basse (low range):
<= 32767 - Plage haute (high range):
>= (1 << 31)
Toute autre valeur de Dictionary_ID peut être utilisée par arrangement privé entre participants.
Toute charge utile soumise pour décompression qui fait référence à un ID de dictionnaire réservé non enregistré entraînera une erreur.
3.1.1.1.4. Frame_Content_Size (Taille du contenu de trame)
Il s'agit de la taille d'origine (non compressée). Cette information est facultative. Frame_Content_Size utilise un nombre variable d'octets, fourni par FCS_Field_Size. FCS_Field_Size est fourni par la valeur de Frame_Content_Size_Flag. FCS_Field_Size peut être égal à 0 (non présent), 1, 2, 4 ou 8 octets.
| FCS Field Size (Taille du champ) | Range (Plage) |
|---|---|
| 0 | unknown (inconnu) |
| 1 | 0 - 255 |
| 2 | 256 - 65791 |
| 4 | 0 - 2^32 - 1 |
| 8 | 0 - 2^64 - 1 |
Tableau 7: Frame_Content_Size
Le format Frame_Content_Size est little-endian. Lorsque FCS_Field_Size est 1, 4 ou 8 octets, la valeur est lue directement. Lorsque FCS_Field_Size est 2, un décalage de 256 est ajouté. Il est permis d'utiliser n'importe quelle variante compatible pour représenter une petite taille (par exemple, 18), même si cela est inefficace.