gzip 圧縮して Base64 エンコードする方法
- 入力欄にテキストを入力するか貼り付けるか、ファイルをドロップします。リアルタイム がオンなので、入力に合わせて出力が更新されます。
- 形式 は gzip のままにします。同じリストに zlib、raw deflate、ブラウザが対応していれば Brotli もあります。
- 文字列を URL やファイル名に入れるなら URLセーフ(- _) に、メールや PEM 風の行の長さにするなら 76 文字で折り返し にチェックを入れます。
- 出力をコピー するか、ダウンロード で Base64 を
.txtファイルとして保存するか、圧縮ファイルをダウンロード でバイナリの.gzを保存します。
メタ情報の行には入力サイズ、圧縮後のサイズ、Base64 のサイズ、圧縮率が表示され、ステータスには同じ入力のプレーン Base64 と比べてどれだけ短いか長いかが表示されます。
先に圧縮する価値があるとき
Base64 は必ずデータを 3 分の 1 増やします。繰り返しのあるデータなら、gzip はその分を取り戻し、さらに縮めることもできます。
| 入力 | プレーン Base64 | gzip + Base64 |
|---|---|---|
Hello, world!(13 バイト) | 20 文字 | 44 文字 |
| 商品レコード 100 件の JSON 配列(9,281 バイト) | 12,376 文字 | 1,096 文字 |
| JPEG 写真 | ファイルの約 4/3 | プレーン Base64 よりわずかに長い |
数値は gzip -6 で求めたものです。ブラウザの圧縮処理では数バイト違うことがあり、入力ごとの正確な数値はメタ情報の行に表示されます。目安として、約 100 バイト未満の入力と圧縮済みのものは、プレーンな Base64 のほうが向いています。
gzip + Base64 の文字列が使われる場面
- cloud-init と VM のユーザーデータ:cloud-init は gzip 圧縮されたユーザーデータを検出するので、クラウドのメタデータサービスのサイズ制限に収めやすくなります。
- AWS CloudWatch Logs のサブスクリプション は、ログのバッチを gzip の Base64 として
awslogs.dataに入れて Lambda に渡します。 - Helm 3 は、各リリースを gzip した JSON の Base64 として Kubernetes の Secret に保存します。
- 環境変数や JSON のフィールド に、設定ファイルや大きなテキストを入れなければならない場合。
- クエリ文字列やディープリンク で状態オブジェクトを渡す場合。ここでは URLセーフな出力を使ってください。
H4sI という接頭辞を除けば、Base64 にはデータが gzip であることを受信側に伝えるものが何もありません。フィールド名や API ドキュメントで明示するか、HTTP なら Base64 にせずバイナリの本文を Content-Encoding: gzip 付きで送ってください。
コードでの gzip + Base64
import base64, gzip
data = open("products.json", "rb").read()
packed = base64.b64encode(gzip.compress(data, mtime=0)).decode()
// Node.js
const zlib = require("zlib");
const packed = zlib.gzipSync(Buffer.from(text)).toString("base64");
ブラウザでは new CompressionStream("gzip") で圧縮でき、このページもそれを使っています。ほかの例は Python と Node.js のページにあります。
よくある問題
- 受信側でゴミのようなデータになる:Base64 はデコードしたものの、gunzip していません。
H4sIで始まっているか確認し、gzip Base64 デコーダー で展開してください。 - 相手側で「incorrect header check」が出る:受信側が gzip ではなく zlib を想定しています。形式 を zlib(deflate)に切り替えてください。どのライブラリがどちらを想定するかは zlib のページ で説明しています。
- Brotli がグレーアウトしている:ブラウザの組み込み圧縮 API が Brotli を提供していません。オプションの下にその旨が表示されます。
- ほかのツールと出力が違う:gzip のヘッダーにはタイムスタンプと OS のバイトが含まれ、圧縮ツールによって選ぶレベルも違います。バイト列が違っても、展開すれば同じ内容になることがあります。
よくある質問
Base64 の前に gzip すると文字列は短くなりますか?
数百バイトを超えるテキスト、JSON、XML、ログなら、たいていかなり短くなります。短い文字列や圧縮済みのデータ(JPEG、PNG、ZIP、MP4)では、gzip がヘッダーとトレーラーで 18 バイトを加えるため、かえって長くなります。
gzip の Base64 文字列がどれも H4sI で始まるのはなぜですか?
gzip のデータはバイト 1F 8B 08 で始まり、この 3 バイトは Base64 で H4sI になります。続く文字はフラグとタイムスタンプで変わり、H4sIAAAAAAAA はファイル名も更新日時もないことを意味します。
ターミナルで gzip と Base64 エンコードをするには?
Linux では gzip -nc file.json | base64 -w0 です。base64 に -w がない macOS では gzip -nc file.json | base64 | tr -d '\n' を使います。-n はファイル名と時刻を省くので、同じ入力からは同じ出力が得られます。