3.1.1.2. Blocks (Blocs)
Après Magic_Number et Frame_Header, il y a plusieurs blocs. Chaque trame doit avoir au moins 1 bloc, mais il n'y a pas de limite supérieure au nombre de blocs par trame.
La structure d'un bloc est la suivante:
+==============+===============+
|| Block_Header | Block_Content |
+==============+===============+
|| 3 bytes | n bytes |
+--------------+---------------+
Tableau 8: Structure d'un bloc
Block_Header utilise 3 octets, écrits en utilisant la convention little-endian. Il contient trois champs:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
Tableau 9: Block_Header
3.1.1.2.1. Last_Block (Dernier bloc)
Le bit de poids faible (Last_Block) indique s'il s'agit du dernier bloc. La trame se terminera après ce dernier bloc. Il peut être suivi d'une Content_Checksum facultative (voir section 3.1.1).
3.1.1.2.2. Block_Type (Type de bloc)
Les 2 bits suivants représentent le Block_Type. Il existe quatre types de blocs:
| Value (Valeur) | Block_Type (Type de bloc) |
|---|---|
| 0 | Raw_Block (Bloc brut) |
| 1 | RLE_Block (Bloc RLE) |
| 2 | Compressed_Block (Bloc compressé) |
| 3 | Reserved (Réservé) |
Tableau 10: Quatre types de blocs
Raw_Block (Bloc brut) : Il s'agit d'un bloc non compressé. Block_Content contient Block_Size octets.
RLE_Block (Bloc RLE) : Il s'agit d'un seul octet, répété Block_Size fois. Block_Content est composé d'un seul octet. Du côté de la décompression, cet octet doit être répété Block_Size fois.
Compressed_Block (Bloc compressé) : Il s'agit du bloc compressé décrit dans la section 3.1.1.3. Block_Size est la longueur de Block_Content, c'est-à-dire les données compressées. La taille décompressée est inconnue, mais sa valeur maximale possible est garantie (voir ci-dessous).
Reserved (Réservé) : Ce n'est pas un bloc. Cette valeur ne peut pas être utilisée avec la spécification actuelle. Si une telle valeur est présente, elle est considérée comme des données corrompues, et un décodeur conforme à la spécification doit la rejeter.
3.1.1.2.3. Block_Size (Taille du bloc)
Les 21 bits supérieurs du Block_Header représentent la Block_Size.
Lorsque Block_Type est Compressed_Block ou Raw_Block, Block_Size est la taille de Block_Content (n'inclut donc pas le Block_Header).
Lorsque Block_Type est RLE_Block, comme la taille de Block_Content est toujours 1, Block_Size représente le nombre de fois que cet octet doit être répété.
Block_Size est limité par Block_Maximum_Size (voir ci-dessous).
3.1.1.2.4. Block_Content and Block_Maximum_Size (Contenu du bloc et taille maximale du bloc)
La taille de Block_Content est limitée par Block_Maximum_Size, qui est le plus petit des deux suivants:
- Window_Size
- 128 KB
Block_Maximum_Size est constant pour une trame donnée. Ce maximum s'applique à la fois à la taille décompressée et à la taille compressée de tout bloc dans la trame.
La justification de cette limitation est que le décodeur peut lire ces informations au début de la trame et les utiliser pour allouer des tampons. La garantie de la taille du bloc assure que le tampon est suffisant pour tous les blocs suivants d'une trame valide.
Si un bloc compressé est plus grand qu'un bloc non compressé, il est recommandé d'envoyer plutôt un bloc non compressé (c'est-à-dire Raw_Block).