gzip(.gz)インスペクター
.gz はアーカイブではなくストリームです。1 個以上のメンバーが連結されたもので、各メンバーが 10 バイトのヘッダー、deflate ストリーム、そして CRC32 と ISIZE(2^32 で割った余りの展開後サイズ)を収めた 8 バイトのトレーラーを個別に持ちます。このページはそのすべてをたどり、各項目が実際に何を言っているかを表示します。1f 8b のマジックと圧縮方式、FLG の 5 ビット(FTEXT、FHCRC、FEXTRA、FNAME、FCOMMENT)とそれが約束する省略可能な項目、日付に直した MTIME(0 は未設定を意味し、再現可能ビルドが書く値です)、XFL(2 は最大圧縮、4 は最速)、名前に展開した OS バイト、2 バイト ID とペイロードに分けた FEXTRA サブフィールド、元のファイル名、コメント、ヘッダー CRC16 までです。そのうえで検証します。各メンバーをブラウザ自身が展開し、その結果から CRC32 を計算し直すので、トレーラーの値を書き写すのではなく実際に突き合わせています。CRC が合わないファイルは、ふつう復元の途中でようやく正体を現し、そのときには元データが失われていることも少なくありません。同じ処理から実際の展開後サイズも得られます。これが gzip -l の数字と食い違うことがある理由です。gzip -l は最後のメンバーの ISIZE を読んでファイル全体のサイズとして出力するため、cat a.gz b.gz で作ったファイルや並列圧縮器の出力では、先行するメンバーの分がまるごと抜け落ちます。ISIZE は 32 ビット幅なので、4GB を超えるメンバーは余りしか保存できず、その項目だけから真のサイズは復元できません。最後のトレーラーの後ろにあるゴミ、途中で切れたメンバー、そもそも gzip でないファイルは、それぞれ名前を付けて報告し、中途半端に解釈しません。メンバー内のファイル名(gunzip -N が復元先とする名前で、パスのこともあれば手元のファイルとまったく別の名前のこともあります)は保存されたまま表示します。規格上は ISO-8859-1 ですが実際にはロケールのバイト列が入るため、読み方が分かれる場合は両方を並べます。
使い方
- .gz、.tgz、その他の gzip ストリームを枠にドロップします。解析も展開もページ内で行い、アップロードはしません。
- まず概要を見ます。ファイルに実際いくつメンバーがあるか、本当の展開後合計、そして CRC32 がすべて一致したかがわかります。
- メンバーを開いてヘッダーを確認します。5 つのフラグビット、MTIME、XFL、OS バイト、保存されたファイル名、コメント、FEXTRA サブフィールドが並びます。
- トレーラーの 2 組を比べます。トレーラーの CRC32 とデータの実際の CRC32、ISIZE と実際の展開後サイズです。両方一致することが、まさに gzip -t の検査内容です。
- 複数メンバーのファイルでは、gzip -l の数値を引用する前に、その値と実際の合計との差を確認してください。
よくある質問
- gzip -l がこのページと違うサイズを表示するのはなぜですか。
- gzip -l は展開を一切行わないからです。ファイル末尾の 4 バイトへシークし、その ISIZE を読んで展開後サイズとして表示します。メンバーが 1 個なら正しい値です。ところがメンバーを連結して作ったファイル(cat a.gz b.gz、アーカイブに追記したログ、独立ブロックを書く pigz や bgzip)では、その 4 バイトは最後のメンバーしか説明しないため、それ以前のメンバーの分がまるごと欠けます。このページは代わりに全メンバーを展開し、実際に出てきたバイト数を合計するので、はるかに大きな値になることがあります。その代わり gzip -l は一瞬で終わり、このページはそうではありません。正直な答えの代金が展開時間です。
- MTIME が 0 とはどういう意味で、この値はいつの時刻ですか。
- MTIME は元ファイルの更新時刻を UTC の Unix エポック秒で保持します。圧縮を実行した時刻でも、ディスク上の .gz のタイムスタンプでもありません。0 は時刻が得られなかったか、保存しなかったという意味です。gzip -n は意図的に 0 を書き、再現可能ビルドも同じことをします。同じ内容をビルドしてもバイトが変わる典型的な原因がタイムスタンプだからです。パイプから圧縮した場合も、時刻を取る元ファイルがないので 0 になります。項目は 4 バイトなので 2106 年より後は表現できず、2^31 を超える値を遠い未来と見るか負の値と見るかは実装によって異なります。
- 元のファイル名が文字化けして見えます。ファイルが壊れているのですか。
- 壊れているのは仕様のほうです。RFC 1952 は FNAME を ISO-8859-1 の文字列と定めていますが、Linux や macOS の gzip はロケールが生成した名前のバイト列をそのまま書きます。今日ではたいてい UTF-8 です。そのため ASCII 以外の名前は、同じエンコーディングを使うシステム間でしか正しく往復しません。UTF-8 で書いた名前を Latin-1 として読むと、おなじみの崩れた文字が出てきます。このページは仕様どおりにデコードした値を示し、同じバイト列が有効な UTF-8 でもあり別の読みになる場合は、その UTF-8 読みを並べて表示します。両方の候補を見て、書き手の意図した名前を判断できます。
- CRC32 の不一致は何を証明し、一致は何を証明しないのですか。
- 不一致は、deflate ストリームから出てきたバイトが、書き込み時に入ったバイトと違うことを意味します。保存中に反転したビット、途中で切れて継ぎ足された転送、圧縮データへの改変などです。gunzip が「invalid compressed data — crc error」と報告するのと同じ失敗で、ただしここでは出力をどこにも書かずに確認できます。一方、一致が証明するのはデータが圧縮器の見たものと同じだということだけです。CRC32 は 32 ビットの誤り検出符号であって署名ではありません。偶発的な破損は非常に高い確率で捕まえますが、データを書き換えられる者は CRC も計算し直せます。真正性の確認には、トレーラーではなくファイル全体に対するハッシュや署名が必要です。
- .tar.gz の中のファイル一覧は見られますか。
- 見られませんし、gzip だけを読むツールでは不可能です。gzip は 1 本のバイトストリームを圧縮するだけで、その中身を知りません。目次もファイルごとのエントリーもなく、前を全部展開せずに 1 ファイルだけ取り出す方法もありません。.tar.gz は、そうした構造を持つ tar アーカイブをまとめて gzip に通したものです。このページが伝えられるのは gzip 層が記録した内容だけです。メンバーがいくつあるか、各ヘッダーの元ファイル名(多くは archive.tar)、タイムスタンプ、そして出てくるデータ量です。エントリーを一覧するには、展開後のストリームを読む tar リーダーが必要です。
- FEXTRA サブフィールドは何に使われますか。
- FEXTRA は拡張点です。長さが前置されたサブフィールドの並びで、各サブフィールドは 2 バイトの ID と自分の長さ、ペイロードから成り、ID を知らないリーダーは読み飛ばさなければなりません。実際の用途はほとんどが gzip ストリームをシーク可能にすることです。bgzip とゲノミクスのあらゆる BAM ファイルの土台である BGZF は「BC」サブフィールドに各ブロックのサイズを書き、ブロック境界へ直接跳べるようにします。dictzip も同じ理由で「RA」の下にチャンク長の表を置きます。どちらも gunzip が普通に読める通常の gzip ファイルのままであり、それがこの仕組みの要点です。見慣れないサブフィールドがあれば、そうしたツールが書いたファイルだという手がかりになります。
関連ツール
NumPy .npy / .npz インスペクター
.npy・.npz のヘッダーをブラウザで読み取ります。dtype、shape、バイト順、フィールド配置、先頭の値まで。NumPy もアップロードも不要です。
Ogg コンテナインスペクター
.ogg / .oga / .opus をページ単位で解析します。グラニュール位置、セグメントテーブル、CRC32 の照合、そしてコンテナが運ぶ論理ストリームを表示します。
CRC-32 計算機 (CRC-32 & CRC-32C)
テキストまたは hex バイトの CRC-32(IEEE 802.3、zip/gzip/PNG)または CRC-32C(Castagnoli)チェックサムを、小文字 hex・大文字 hex・符号なし 10 進数で計算 — ブラウザ内で。
xz(.xz)ストリーム解析ツール
xz コンテナを読み取ります。ストリームヘッダー、各ブロックのヘッダーとフィルターチェーン、インデックス、フッター、そして展開せずに分かる本当のサイズまで。
SQLite データベース検査ツール
.sqlite や .db をブラウザーで開いて構造を読み取ります。ページサイズ、エンコーディング、ジャーナルモード、各テーブルの実際の行数まで。
Favicon ジェネレーター(マルチサイズ PNG)
1 枚の画像から 10 サイズの favicon PNG(16・32・48・64・96・128・180・192・256・512)を生成 — HTML スニペット付き。