Passa al contenuto principale

5. Dictionary Format (Formato Dizionario)

Zstandard è compatibile con i "dizionari di contenuto grezzo (Raw Content Dictionaries)", senza alcuna restrizione di formato, tranne che devono essere almeno 8 byte. Questi dizionari funzionano come se fossero solo la parte di contenuto di un dizionario formattato.

Tuttavia, i dizionari creati da zstd --train nell'implementazione di riferimento seguono un formato specifico, descritto qui.

I dizionari non sono inclusi nel contenuto compresso, ma forniti fuori banda (out of band). Cioè, Dictionary_ID identifica quale dizionario deve essere utilizzato, ma questa specifica non descrive il meccanismo per ottenere il dizionario prima dell'uso durante la compressione o decompressione.

Un dizionario ha una dimensione, definita dai limiti del buffer o dalla dimensione del file. Il formato generale è:

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

Tabella 27: Formato Generale Dizionario

Magic_Number (Numero Magico) : ID di 4 byte, valore 0xEC30A437, formato little-endian.

Dictionary_ID (ID Dizionario) : 4 byte, memorizzati in formato little-endian. Dictionary_ID può essere qualsiasi valore, tranne 0 (che indica l'assenza di Dictionary_ID). I decoder lo utilizzano per verificare di utilizzare il dizionario corretto. Se il frame viene distribuito in un ambiente privato, può essere utilizzato qualsiasi Dictionary_ID. Tuttavia, per la distribuzione pubblica di frame compressi, i seguenti intervalli sono riservati e non devono essere utilizzati:

  • Intervallo basso: <= 32767
  • Intervallo alto: >= 2³¹

Entropy_Tables (Tabelle di Entropia) : Seguono lo stesso formato delle tabelle nei blocchi compressi. Per informazioni su come decodificare queste tabelle, consultare le sezioni FSE e Huffman pertinenti. Sono memorizzate nel seguente ordine: tabella Huffman per i letterali, tabella FSE per gli offset, tabella FSE per le lunghezze di corrispondenza e tabella FSE per le lunghezze dei letterali. Queste tabelle riempiono la modalità letterali con statistiche ripetute (Repeat Stats Literals Mode) e la modalità distribuzione ripetuta (Repeat Distribution Mode) della decodifica delle sequenze. Infine, ci sono 3 valori di offset che riempiono gli offset ripetuti (invece di usare 8), memorizzati in sequenza, ciascuno 4 byte little-endian, per un totale di 12 byte. Ogni offset ripetuto deve avere un valore inferiore alla dimensione del dizionario.

Content (Contenuto) : Il resto del dizionario è il suo contenuto. Il contenuto funge da "passato" prima dei dati da comprimere o decomprimere, in modo che possa essere referenziato nei comandi di sequenza (Sequence Commands). Finché la quantità di dati decodificati da questo frame è minore o uguale a Window_Size, i comandi di sequenza possono specificare un offset più lungo della lunghezza totale dell'output decodificato finora per fare riferimento al dizionario, anche a parti del dizionario con offset maggiori di Window_Size. Tuttavia, dopo che l'output totale supera Window_Size, questo non è più consentito e il dizionario non è più accessibile.