Aller au contenu principal

5. Dictionary Format (Format de dictionnaire)

Zstandard est compatible avec les dictionnaires de "contenu brut" (Raw Content Dictionaries), sans aucune restriction de format, sauf qu'ils doivent faire au moins 8 octets. Ces dictionnaires fonctionnent comme s'ils n'étaient que la partie contenu d'un dictionnaire formaté.

Cependant, les dictionnaires créés par zstd --train dans l'implémentation de référence suivent un format spécifique, décrit ici.

Les dictionnaires ne sont pas inclus dans le contenu compressé mais sont plutôt fournis hors bande (Out of Band). C'est-à-dire que le Dictionary_ID identifie lequel doit être utilisé, mais cette spécification ne décrit pas le mécanisme par lequel le dictionnaire est obtenu avant utilisation pendant la compression ou la décompression.

Un dictionnaire a une taille, définie soit par une limite de tampon, soit par une taille de fichier. Le format général est :

+==============+===============+================+=========+
| Magic_Number | Dictionary_ID | Entropy_Tables | Content |
+==============+===============+================+=========+

Tableau 27 : Format général du dictionnaire

Magic_Number (Nombre magique) : ID de 4 octets, valeur 0xEC30A437, format little-endian.

Dictionary_ID (ID de dictionnaire) : 4 octets, stockés au format little-endian. Dictionary_ID peut être n'importe quelle valeur, sauf 0 (qui signifie pas de Dictionary_ID). Il est utilisé par les décodeurs pour vérifier qu'ils utilisent le bon dictionnaire. Si la trame doit être distribuée dans un environnement privé, n'importe quel Dictionary_ID peut être utilisé. Cependant, pour la distribution publique de trames compressées, les plages suivantes sont réservées et ne doivent pas être utilisées :

  • Plage basse : <= 32767
  • Plage haute : >= 2³¹

Entropy_Tables (Tables d'entropie) : Suivent le même format que les tables dans les blocs compressés. Voir les sections FSE et Huffman pertinentes pour savoir comment décoder ces tables. Elles sont stockées dans l'ordre suivant : table Huffman pour les littéraux, table FSE pour les offsets, table FSE pour les longueurs de correspondance et table FSE pour les longueurs de littéraux. Ces tables remplissent le mode littéraux de statistiques répétées (Repeat Stats Literals Mode) et le mode de distribution répétée (Repeat Distribution Mode) pour le décodage de séquence. Elles sont finalement suivies de 3 valeurs d'offset, remplissant les offsets répétés (au lieu d'utiliser {1,4,8}), stockées dans l'ordre, 4 octets little-endian chacune, pour un total de 12 octets. Chaque offset répété doit avoir une valeur inférieure à la taille du dictionnaire.

Content (Contenu) : Le reste du dictionnaire est son contenu. Le contenu agit comme un "passé" devant les données à compresser ou à décompresser, de sorte qu'il puisse être référencé dans les commandes de séquence (Sequence Commands). Tant que la quantité de données décodées de cette trame est inférieure ou égale à Window_Size, les commandes de séquence peuvent spécifier des offsets plus longs que la longueur totale de sortie décodée jusqu'à présent pour référencer le dictionnaire, même les parties du dictionnaire avec des offsets supérieurs à Window_Size. Après que la sortie totale a dépassé Window_Size, cependant, cela n'est plus autorisé, et le dictionnaire n'est plus accessible.