Developer Toolbox

gzip (DEFLATE)

gzip がテキストを小さくする仕組みを見てみましょう。繰り返しは短いコピーになり、ハフマン符号は頻出する記号に少ないビットを割り当てます。

  • ウィンドウ: 32 KB
  • コピー: 3-258 バイト
  • 符号: 最大 15 ビット
  • gzip フレーム: 18 バイト
用語の意味
  • リテラル: そのまま書き込まれる文字。その位置から始まる3文字以上の繰り返しがないためです。
  • コピー: 「この文字数を、これだけ前から取ってくる」という意味の長さと距離の組。自分が生成するテキストと重なってもかまいません。
  • ウィンドウ: 圧縮器が繰り返しを探せる範囲(どこまでさかのぼれるか)。gzip では 32 KB、Brotli では最大 16 MB です。
  • ハフマン符号: 記号ごとのビット列。頻出する記号ほど短く、最もまれな2つの記号を何度も結合していく木から作られます。
  • プレフィックスフリー: どの符号もほかの符号の先頭部分になっていないため、区切りなしで符号の列を読み戻せます。
LZ77 とハフマンをステップ実行 0 / 19 ステップ

テキストは 23 文字、圧縮なしで 184 ビットです。圧縮器は左から右へ読み進め、各位置で、この先に続く部分が前にも出てきたかを調べます。

スペースキー: 再生・一時停止。左右の矢印キー: ステップ移動。Home キーと End キー: ジャンプ。

試してみましょう: 同じ文字を何度も入力してみてください。距離 1 のコピー1つですべてをカバーできます。コピーは自分が生成するテキストと重なってもよいからです。

仕組み

gzip は DEFLATE を2段階で実行します。LZ77 はテキストを先頭から順にたどり、各位置で直前の 32 KB にすでに出てきた最長のバイト列を探します。そのバイトを繰り返す代わりに、コピーするバイト数(3-258)とどれだけ前にあるかの組を書き込みます。残ったもの、つまりリテラルとこれらの組は、次にハフマン符号で書き込まれます。頻出する記号には短い符号、まれな記号には長い符号が割り当てられます。gzip はその結果を 10 バイトのヘッダーと、CRC-32 チェックサムを含む 8 バイトのトレーラーで包みます。

向いている場面

gzip は繰り返しの多いテキストを圧縮します。HTML、CSS、JavaScript、JSON、ログ、CSV などです。すべてのブラウザとサーバーが対応し、どのレベルでも速く、レスポンスをその場で圧縮するときの無難な既定の選択です。JPEG、PNG、WOFF2、ZIP のようにすでに圧縮されたデータには繰り返しが残っていないので、gzip は自分のフレームを付け足すだけです。

あなたのテキストで

同じ2段階を、実際の gzip(レベル 6)がもっと長いテキストで行います。自分のテキストを貼り付けるか、Gzip・Brotli 圧縮ツールから持ってきてください。

入力