5. Dictionary Format (Wörterbuchformat)
Zstandard ist mit „Raw Content Dictionaries" (Rohinhaltswörterbüchern) kompatibel, ohne jegliche Formatbeschränkung, außer dass sie mindestens 8 Bytes groß sein müssen. Diese Wörterbücher funktionieren, als wären sie nur der Inhaltsteil eines formatierten Wörterbuchs.
Allerdings folgen die von zstd --train in der Referenzimplementierung erstellten Wörterbücher einem spezifischen Format, das hier beschrieben wird.
Wörterbücher sind nicht im komprimierten Inhalt enthalten, sondern werden out-of-band bereitgestellt. Das heißt, die Dictionary_ID identifiziert, welches Wörterbuch verwendet werden soll, aber diese Spezifikation beschreibt nicht den Mechanismus zum Abrufen des Wörterbuchs vor der Verwendung während der Kompression oder Dekompression.
Ein Wörterbuch hat eine Größe, die durch Puffergrenzen oder Dateigröße definiert ist. Das allgemeine Format ist:
+==============+===============+================+=========+
| Magic_Number | Dictionary_ID | Entropy_Tables | Content |
+==============+===============+================+=========+
Tabelle 27: Allgemeines Wörterbuchformat
Magic_Number (Magische Zahl)
: 4-Byte-ID, Wert 0xEC30A437, Little-Endian-Format.
Dictionary_ID (Wörterbuch-ID) : 4 Bytes, im Little-Endian-Format gespeichert. Die Dictionary_ID kann jeden Wert haben, außer 0 (was anzeigt, dass keine Dictionary_ID vorhanden ist). Decoder verwenden diese, um zu überprüfen, ob sie das richtige Wörterbuch verwenden. Wenn der Frame in einer privaten Umgebung verteilt wird, kann jede Dictionary_ID verwendet werden. Für die öffentliche Verteilung komprimierter Frames sind jedoch die folgenden Bereiche reserviert und dürfen nicht verwendet werden:
- Niedriger Bereich:
<= 32767 - Hoher Bereich:
>= 2³¹
Entropy_Tables (Entropietabellen) : Folgen dem gleichen Format wie Tabellen in komprimierten Blöcken. Informationen zum Dekodieren dieser Tabellen finden Sie in den entsprechenden FSE- und Huffman-Abschnitten. Sie werden in der folgenden Reihenfolge gespeichert: Huffman-Tabelle für Literale, FSE-Tabelle für Offsets, FSE-Tabelle für Match-Längen und FSE-Tabelle für Literal-Längen. Diese Tabellen füllen den Wiederholungsstatistik-Literal-Modus (Repeat Stats Literals Mode) und den Wiederholungsverteilungsmodus (Repeat Distribution Mode) der Sequenzdekodierung. Schließlich gibt es 3 Offset-Werte, die die wiederholten Offsets füllen (anstatt 8 zu verwenden), nacheinander gespeichert, jeweils 4 Bytes Little-Endian, insgesamt 12 Bytes. Jeder wiederholte Offset muss einen Wert kleiner als die Wörterbuchgröße haben.
Content (Inhalt) : Der Rest des Wörterbuchs ist sein Inhalt. Der Inhalt dient als „Vergangenheit" vor den zu komprimierenden oder dekomprimierenden Daten, sodass er in Sequenzbefehlen (Sequence Commands) referenziert werden kann. Solange die Menge der aus diesem Frame dekodierten Daten kleiner oder gleich Window_Size ist, können Sequenzbefehle einen Offset angeben, der länger ist als die Gesamtlänge der bisher dekodierten Ausgabe, um auf das Wörterbuch zurückzuverweisen, selbst auf Teile des Wörterbuchs mit Offsets größer als Window_Size. Nach Überschreiten der Window_Size in der Gesamtausgabe ist dies jedoch nicht mehr erlaubt, und das Wörterbuch ist nicht mehr zugänglich.