玄関コンピュータの部屋各種解説コーナーデータ圧縮法概説

5.5 LZ77符号の復号化手順

LZ77符号の復号化手順は以下のとおりです。

  1. 参照部Nバイト、符号化部Fバイトの大きさのスライド窓を用意する。

    NとFは符号化時と同じ値を用いる必要があります。 そのためには最初からNとFをある定数に固定してしまってもかまいませんし、NとFの値を符号化したデータ中にオーバーヘッドとして追加してもかまいません。

    LZ77符号を応用した圧縮アーカイバLHAは、スライド窓の大きさが異なる数種類の圧縮法をサポートしていて、それらを「-lh5-」や「-lh6-」といった識別コードによって区別しています。

    LZ77復号化1
  2. 最初の記号を符号化部の先頭にコピーする。

    最初の記号は本来は「00<最初の記号>」であり、この作業はその符号を復号したことに相当します。

    LZ77復号化2
  3. 符号化部の記号を復号し、スライド窓を1バイト右にスライドする。
    LZ77復号化3
  4. [最長一致系列の参照部の先頭からのオフセット値][最長一致系列の記号数][一致しない最初の記号」という形式の符号を読み込み、それを各要素に分解する。 そして対応する参照部の記号列を符号化部の先頭からコピーし、その後に一致しない最初の記号をコピーする。

    例えば 「mpx」という符号の場合、参照部のオフセットmから始るpバイトを符号化部の先頭からコピーし、その後にxをコピーします。 mとpがどちらも0の場合は、一致しない最初の記号を符号化部の先頭にコピーします。

    LZ77復号化4

    また下図のように、コピーする記号列が符号化部にまで入り込む場合もあります。 例えば「(N-3)5d」という符号の場合、オフセット(N-3)から始る3バイトを符号化部の先頭にコピーし、その後にコピーしたばかりの符号化部の先頭の2バイトをコピーし、さらにその後にdをコピーします。

    LZ77復号化5
  5. 符号化部の記号列を復号し、スライド窓を復号化した(p+1)バイトだけ右にスライドする。
    LZ77復号化6
  6. 符号化データが終了するまで4.と5.を繰り返す。

    最後の符号が「mp」だけの場合は、参照部の記号列をコピーし、それを復号して終了します。

    LZ77復号化7

5.6 LZ77符号の復号化実例

例として、符号化の実例で符号化した「a71b71c73d73e77f73」を前節の手順に従って復号化してみましょう。

  1. 参照部8バイト、符号化部8バイトの大きさのスライド窓を用意する。
    LZ77復号化例1
  2. 最初の記号を符号化部の先頭にコピーする。
    LZ77復号化例2
  3. 符号化部の記号を復号し、スライド窓を1バイト右にスライドする。
    LZ77復号化例3
    復元データ:a
  4. 「71b」を読み込み、対応する参照部の記号列を符号化部にコピーし、その後に不一致記号をコピーする。
    LZ77復号化例4
    最長一致系列のオフセット値m=7 バイト数p=1 最初の不一致記号:b
  5. 符号化部の記号列を復号し、スライド窓を2バイト右にスライドする。
    LZ77復号化例5
    復元データ:aab
  6. 「71c」を読み込み、対応する参照部の記号列を符号化部にコピーし、その後に不一致記号をコピーする。
    LZ77復号化例6 最長一致系列のオフセット値m=7 バイト数p=1 最初の不一致記号:c
  7. 符号化部の記号列を復号し、スライド窓を2バイト右にスライドする。
    LZ77復号化例7
    復元データ:aabbc
  8. 「73d」を読み込み、対応する参照部の記号列を符号化部にコピーし、その後に不一致記号をコピーする。
    LZ77復号化例8 最長一致系列のオフセット値m=7 バイト数p=3 最初の不一致記号:d
  9. 符号化部の記号列を復号し、スライド窓を4バイト右にスライドする。
    LZ77復号化例9
    復元データ:aabbccccd
  10. 「73e」を読み込み、対応する参照部の記号列を符号化部にコピーし、その後に不一致記号をコピーする。
    LZ77復号化例10
    最長一致系列のオフセット値m=7 バイト数p=3 最初の不一致記号:e
  11. 符号化部の記号列を復号し、スライド窓を4バイト右にスライドする。
    LZ77復号化例11
    復元データ:aabbccccdddde
  12. 「77f」を読み込み、対応する参照部の記号列を符号化部にコピーし、その後に不一致記号をコピーする。
    LZ77復号化例12
    最長一致系列のオフセット値m=7 バイト数p=7 最初の不一致記号:f
  13. 符号化部の記号列を復号し、スライド窓を8バイト右にスライドする。
    LZ77復号化例13
    復元データ:aabbccccddddeeeeeeeef
  14. 「73」を読み込み、対応する参照部の記号列を符号化部にコピーする。
    LZ77復号化例14
    最長一致系列のオフセット値m=7 バイト数p=3 最初の不一致記号:なし
  15. 符号化部の記号列を復号し、復号化終了。
    LZ77復号化例15
    復元データ:aabbccccddddeeeeeeeeffff

5.7 LZ77符号化の特徴