メインコンテンツまでスキップ

5. Dictionary Format (辞書形式)

Zstandard は「生コンテンツ辞書 (Raw Content Dictionaries)」と互換性があり、少なくとも 8 バイト以上でなければならないという制約以外、形式に制限はありません。これらの辞書は、フォーマット済み辞書のコンテンツ部分のみであるかのように機能します。

ただし、参照実装の zstd --train によって作成される辞書は、ここで説明する特定の形式に従います。

辞書は圧縮コンテンツに含まれず、帯域外 (Out of Band) で提供されます。つまり、Dictionary_ID はどの辞書を使用すべきかを識別しますが、この仕様では圧縮または解凍の前に辞書を取得するメカニズムは説明していません。

辞書にはサイズがあり、バッファ制限またはファイルサイズによって定義されます。一般的な形式は次のとおりです:

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

表 27: 辞書の一般形式

Magic_Number (マジックナンバー) : 4 バイト ID、値 0xEC30A437、リトルエンディアン形式。

Dictionary_ID (辞書ID) : 4 バイト、リトルエンディアン形式で格納されます。Dictionary_ID は 0 を除く任意の値を取ることができます (0 は Dictionary_ID が存在しないことを表します)。デコーダーはこれを使用して、正しい辞書を使用しているかを確認します。フレームがプライベート環境で配布される場合、任意の Dictionary_ID を使用できます。ただし、圧縮フレームを公開配布する場合、次の範囲は予約されており、使用してはなりません:

  • 低範囲: <= 32767
  • 高範囲: >= 2³¹

Entropy_Tables (エントロピーテーブル) : 圧縮ブロック内のテーブルと同じ形式に従います。これらのテーブルをデコードする方法については、関連する FSE および Huffman セクションを参照してください。それらは次の順序で格納されます: リテラル用の Huffman テーブル、オフセット用の FSE テーブル、マッチ長用の FSE テーブル、およびリテラル長用の FSE テーブル。これらのテーブルは、シーケンスデコードの繰り返し統計リテラルモード (Repeat Stats Literals Mode) および繰り返し分布モード (Repeat Distribution Mode) を埋めます。最後に、3 つのオフセット値があり、繰り返しオフセットを埋め (8 を使用する代わりに)、順に格納され、それぞれ 4 バイトのリトルエンディアン、合計 12 バイトです。各繰り返しオフセットは、辞書サイズより小さい値を持つ必要があります。

Content (コンテンツ) : 辞書の残りの部分はそのコンテンツです。コンテンツは、圧縮または解凍されるデータの前にある「過去 (Past)」として機能し、シーケンスコマンド (Sequence Commands) で参照できます。このフレームからデコードされたデータ量が Window_Size 以下である限り、シーケンスコマンドは、これまでにデコードされた出力の合計長より長いオフセットを指定して、辞書を参照できます。これには、辞書内のオフセットが Window_Size より大きい部分も含まれます。ただし、合計出力が Window_Size を超えた後は、これは許可されなくなり、辞書にアクセスできなくなります。