このページの内容

辞書形式

Zstandardは「生の内容」の辞書と互換性があります。この辞書には、少なくとも8バイトでなければならないという条件以外、形式の制約はありません。形式付き辞書の Content 部分だけからなるものとして機能します。

一方、zstd --train が作成する辞書は、ここで説明する形式に従います。

前提条件:辞書のサイズが、バッファーの境界またはファイルサイズによって定まっていること。

Magic_NumberDictionary_IDEntropy_TablesContent

Magic_Number:4バイトのIDで、値は0xEC30A437、リトルエンディアン形式です。

Dictionary_ID:4バイトで、リトルエンディアン形式で格納します。Dictionary_ID は、0(Dictionary_ID なしを意味する)以外の任意の値を取れます。デコーダーは、正しい辞書を使っているかどうかの確認にこの値を使います。

予約範囲:辞書を公開された環境で配布する場合、次の Dictionary_ID の範囲は、将来の登録機関のために予約されており、使用してはなりません。

- low range  : <= 32767
- high range : >= (2^31)

この範囲外で、>= 32768 かつ < (1<<31) である Dictionary_ID の値は、公開された環境でも自由に使用できます。

Entropy_Tables:圧縮ブロックの表と同じ形式に従います。表の復号方法は、対応するFSEとHuffmanの節を参照してください。

格納順は、リテラル用Huffman表、オフセット用FSE表、マッチ長用FSE表、リテラル長用FSE表です。これらの表は、リテラルのRepeat Statsモードと、シーケンス復号のRepeat distributionモードで使用する表となります。

最後に、最近のオフセットの初期値として使用する3つのオフセット値が続きます({1,4,8} の代わりに使用します)。各値は4バイトのリトルエンディアンで順番に格納し、合計12バイトです。各最近のオフセットは、辞書内容のサイズ以下でなければならず、0にすることはできません。

Content:辞書の残りの部分が、その内容です。この内容は、圧縮または展開するデータの前に存在する「過去」のデータとして働くため、シーケンスコマンドから参照できます。

このフレームから復号したデータ量が Window_Size 以下である間、シーケンスコマンドは、それまでの復号出力の合計長を超えるオフセットを指定して、辞書をさかのぼって参照できます。辞書内の、オフセットが Window_Size を超える部分も参照できます。ただし、出力の合計が Window_Size を超えると、この参照は認められなくなり、辞書にはアクセスできなくなります。

外部の提供元から辞書を受け取る場合は、その内容を信頼できないものとして扱い、十分注意して読み込むべきです。