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

3.1.1.4. Sequence Execution (シーケンス実行)

リテラルとシーケンスの両方がデコードされると、それらが組み合わされてブロックのデコードされたコンテンツが生成されます。

各シーケンスは、Sequences_Section (セクション 3.1.1.3.2) で説明されているようにデコードされたタプル (literals_length, offset_value, match_length) で構成されます。シーケンスを実行するには、まずデコードされたリテラルから literals_length バイトを出力にコピーします。

次に、以前にデコードされたデータから match_length バイトをコピーします。コピー元のオフセットは offset_value によって決定されます:

  • if Offset_Value > 3: オフセットは Offset_Value - 3 です;

  • if Offset_Value is from 1-3: オフセットは特別なリピートオフセット値です。この場合のオフセットの決定方法については、セクション 3.1.1.5 を参照してください。

オフセットは現在の位置 (リテラルをコピーした後) から定義されるため、オフセットが 6 でマッチ長が 3 の場合、6 バイト前から 3 バイトをコピーする必要があります。以前にデコードされたデータにつながるすべてのオフセットは、Frame_Header_Descriptor (セクション 3.1.1.1.1) で定義された Window_Size 未満である必要があることに注意してください。


実行フロー例

例 1: 基本的なシーケンス実行

シーケンスが (literals_length=5, offset_value=10, match_length=4) であるとします:

  1. リテラルをコピー: リテラルセクションから 5 バイトを出力にコピー
  2. オフセットを計算: Offset_Value=10 > 3、したがって Offset = 10 - 3 = 7
  3. マッチをコピー: 出力位置から 7 バイト前から 4 バイトをコピー

例 2: リピートオフセットの使用

シーケンスが (literals_length=3, offset_value=1, match_length=8) であるとします:

  1. リテラルをコピー: リテラルセクションから 3 バイトを出力にコピー
  2. リピートオフセットを使用: offset_value=1 は Repeated_Offset1 を使用することを意味します
  3. マッチをコピー: Repeated_Offset1 位置から 8 バイトをコピー

重要な制約

  1. Window_Size 制限: すべてのオフセットは < Window_Size でなければなりません
  2. データ整合性: オフセットがデコードされたデータの範囲を超えないようにする必要があります
  3. リテラル消費: すべてのシーケンスが実行された後、残りのリテラルは出力の最後に追加されます