gzip の Base64 文字列をデコードする方法
- 入力欄に Base64 を貼り付けるか、
.gz、.zz、.deflateファイルをドロップします。空白や改行は無視されます。 - 形式 は 自動検出 のままにしておきます。ステータスに「gzip を検出」のように判別結果が表示されます。
- テキストの結果は出力欄に表示され、JSON は整形されます。バイナリの場合はファイル形式を判別し、ダウンロード ボタンを表示します。
- gzip の入力では、送信側が記録していれば元のファイル名と更新日時もメタ情報に表示されます。
gzip、zlib、deflate の見分け方
3 つとも同じ DEFLATE 圧縮を使い、違うのはラッパーだけです。その違いは Base64 の先頭の文字に表れます。
| 先頭 | 形式 | 主な出どころ |
|---|---|---|
H4sI | gzip(1F 8B 08) | gzip、GZIPOutputStream、HTTP のボディ、CloudWatch Logs |
eJ | zlib、デフォルトレベル(78 9C) | zlib.compress()、PHP の gzcompress()、PDF のストリーム |
eNo–eNr | zlib、最高圧縮(78 DA) | レベル 7~9 |
eAE–eAH、eF4–eF7 | zlib、最速・低レベル(78 01、78 5E) | レベル 1~5 |
| 固定の接頭辞なし | raw deflate | SAML の Redirect バインディング、PHP の gzdeflate()、ZIP のエントリ |
SDRzSU | 二重に Base64 エンコードされた gzip | Helm のリリース Secret |
raw deflate にはシグネチャがないため、自動検出では gzip と zlib が失敗した後に試します。Brotli にもシグネチャがなく、ブラウザが対応している場合に最後に試します。
実際のペイロード
AWS CloudWatch Logs のサブスクリプションイベントは、{"awslogs": {"data": "H4sI…"}} の形で Lambda に届きます。data の値を貼り付ければ、logGroup、logStream、logEvents を含む JSON を読めます。
Helm 3 のリリース Secret には gzip した JSON の Base64 が入っていて、Kubernetes がそれをさらに Base64 エンコードしています。シェルからは次のようにします。
kubectl get secret sh.helm.release.v1.myapp.v3 -o jsonpath='{.data.release}' \
| base64 --decode | base64 --decode | gunzip | jq -r .manifest
ブラウザで処理するなら、まず外側の層を Kubernetes Secret デコーダー か Base64 デコーダー でデコードし、得られた H4sI… をここに貼り付けてください。
SAML の Redirect メッセージ は raw deflate です。ここでもデコードできますが、SAML デコーダー なら URL デコードも行い、XML の要約も表示します。
Python と Node.js でのデコード
import base64, zlib
raw = base64.b64decode(s)
text = zlib.decompress(raw, 47).decode() # 47 = 32 + 15: accept gzip or zlib
const zlib = require("zlib");
const text = zlib.unzipSync(Buffer.from(s, "base64")).toString(); // gzip or zlib
raw deflate の場合、Python では zlib.decompress(raw, -15)、Node では zlib.inflateRawSync() を使います。Python での Base64 と Node.js での Base64 も参照してください。
エラーと制限
- 「有効な Base64 ですが、gzip、zlib、raw deflate のデータではありません。」 文字列はそもそも圧縮されていません。Base64 デコーダー を、バイナリなら Base64 をファイルに変換 を試してください。
- 「有効な gzip データではないか、途中で切れています。」 文字列の一部が欠けています。ログの行長制限で切れていることがよくあります。元の場所からコピーし直してください。
- 「圧縮ストリームの後の余分なバイトは無視しました。」 ストリームの終端の後に何かが追加されています。それより前のデータはそのまま残ります。
- 「展開後のデータが 256.0 MB を超えたため停止しました(zip 爆弾の可能性)。」 展開爆弾(decompression bomb)への対策として出力に上限を設けています。それほど大きなデータはローカルの
gunzipを使ってください。 - 複数メンバーの gzip ファイル(複数の gzip ストリームを連結したもの)には対応していません。
よくある質問
Base64 文字列の先頭の H4sI は何を意味しますか?
gzip のシグネチャに deflate 方式のバイトが続いた 1F 8B 08 を Base64 にしたものです。H4sI で始まる文字列は gzip データなので、Base64 をデコードしてから gunzip してください。
コマンドラインで Base64 の gzip をデコードするには?
Linux と macOS では echo 'H4sI…' | base64 --decode | gunzip です。zlib データ(eJ…)は gunzip がヘッダーを受け付けないので、Base64 をデコードした後に python3 -c 'import sys,zlib; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))' を使ってください。
Base64 をデコードしたらバイナリが出てきたのはなぜですか?
エンコードの前にデータが圧縮されていたため、通常の Base64 デコーダーでは圧縮されたバイト列がそのまま返ります。このページに貼り付ければ、デコードと展開を一度に行います。
.zip や .tar.gz ファイルも開けますか?
.tar.gz は展開すると .tar アーカイブになり、それをダウンロードできます。ZIP アーカイブは別のコンテナ形式なので、Base64 を ZIP に変換 で一覧表示・保存してください。