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) であるとします:
- リテラルをコピー: リテラルセクションから 5 バイトを出力にコピー
- オフセットを計算: Offset_Value=10 > 3、したがって Offset = 10 - 3 = 7
- マッチをコピー: 出力位置から 7 バイト前から 4 バイトをコピー
例 2: リピートオフセットの使用
シーケンスが (literals_length=3, offset_value=1, match_length=8) であるとします:
- リテラルをコピー: リテラルセクションから 3 バイトを出力にコピー
- リピートオフセットを使用: offset_value=1 は Repeated_Offset1 を使用することを意味します
- マッチをコピー: Repeated_Offset1 位置から 8 バイトをコピー
重要な制約
- Window_Size 制限: すべてのオフセットは < Window_Size でなければなりません
- データ整合性: オフセットがデコードされたデータの範囲を超えないようにする必要があります
- リテラル消費: すべてのシーケンスが実行された後、残りのリテラルは出力の最後に追加されます