辞書形式
Zstandardは「生の内容」の辞書と互換性があります。この辞書には、少なくとも8バイトでなければならないという条件以外、形式の制約はありません。形式付き辞書の Content 部分だけからなるものとして機能します。
一方、zstd --train が作成する辞書は、ここで説明する形式に従います。
前提条件:辞書のサイズが、バッファーの境界またはファイルサイズによって定まっていること。
Magic_Number | Dictionary_ID | Entropy_Tables | Content |
|---|
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 を超えると、この参照は認められなくなり、辞書にはアクセスできなくなります。
外部の提供元から辞書を受け取る場合は、その内容を信頼できないものとして扱い、十分注意して読み込むべきです。