ByteScope

7-Zip ファイル形式

7-Zip アーカイブ。LZMA/LZMA2 により高い圧縮率が得られます。

MIME タイプ
application/x-7z-compressed
拡張子
.7z
カテゴリ
アーカイブ・圧縮

マジックナンバー(ファイル署名)

0x00000000377ABCAF271C7z··'·7z magic

7-Zip 形式について

7z は 7-Zip のネイティブ形式で、強力な LZMA2 圧縮、ソリッドアーカイブ、AES-256 暗号化に対応します。署名は 37 7A BC AF 27 1C です。固定の配置は先頭 32 バイトですべてです。署名、フォーマットのバージョン、そして本当のヘッダがある場所へのポインタ。それ以外のもの、つまりファイル名、サイズ、タイムスタンプ、チェックサム、そしてデータがどう符号化されたかの記述は、すべてファイルの反対側の端にあるそのヘッダの中にあり、たいていそれ自体も圧縮されています。その間にファイルごとのヘッダは一切存在しません。それが .7z をコンパクトにしている理由であり、壊れたときに ZIP よりはるかに救い出しにくい理由でもあります。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
06Signature37 7A BC AF 27 1C。先頭 2 バイトは ASCII の 7z なので読めるテキストとして現れます。残りの 4 バイトは、テキストファイルが一致しようのないように選ばれた任意のバイナリです。
61Format major versionこれまでに書かれたどのアーカイブでも 0 です。ここが変わることは構造的に非互換な形式を意味するので、リーダーはそれ以外の値を警告ではなく拒否として扱います。
71Format minor version今のアーカイブでは 4 です。マイナーバージョンは後方互換な追加なので、0.4 を理解できるリーダーはそれより古いものをすべて扱えます。
84Start header CRC-32リトルエンディアンで、オフセット 12 から 31 のちょうど 20 バイトを対象にします。他のすべてが依存するポインタを守るためのもので、どこかへシークする前に、先頭部分の破損か本体の破損かをリーダーが判断できます。
128Next header offset本当のヘッダへのリトルエンディアン 64 ビットのオフセットで、ファイル先頭からではなく、この署名ヘッダの終わりであるオフセット 32 から数えます。200246 バイトのアーカイブでは F4 0D 03 00 00 00 00 00、つまり 200180 と読めるので、ヘッダは 200212 から始まります。
208Next header sizeそのヘッダの長さをリトルエンディアン 64 ビットで。オフセットと合わせて、ちょうどファイルの終端に着地しなければなりません。32 足す 200180 足す 34 は 200246 で、これがファイルの実サイズです。この算数がいちばん手軽な整合性チェックです。
284Next header CRC-32手前の 2 つのフィールドが指すヘッダのチェックサムをリトルエンディアンで。解析を試みる前に、そこの破損を検出できます。
32variablePacked streams圧縮データそのもので、32 バイトの署名ヘッダの直後に書かれます。ソリッドアーカイブではこれがファイルごとに 1 本ではなく、多数のファイルにまたがる連続した符号化ストリーム 1 本になります。
variablevariableHeaderオフセット 32 に next header offset を足した位置にある、アーカイブの本当のディレクトリです。名前、サイズ、CRC、タイムスタンプ、属性、そして packed streams のデコード手順を記述するコーダチェーンが入ります。通常はそれ自体が LZMA で圧縮されていて、ヘッダ暗号化を有効にしていれば暗号化もされています。

似た形式との見分け方

紛らわしい形式見分け方
XZ実際に事故を起こすのがこれです。.xz は FD 37 7A 58 5A 00 で始まるので、オフセット 1 に 37 7A が現れ、hex ダンプには ASCII の 7zXZ がはっきり見えます。本物の .7z はオフセット 0 が 37 7A BC AF 27 1C です。1 つずれた位置に同じバイトがある、無関係な 2 つの形式です。.7z はディレクトリを持つ複数ファイルのアーカイブ、.xz は単一の圧縮ストリームです。
ZIP共通するバイトはありません。50 4B 03 04 と 37 7A BC AF 27 1C。それでも同じツールが両方を書くので、ラベルの取り違えは絶えません。構造上の違いはディレクトリの場所と、それにかかるコストです。ZIP は 1 エントリの一覧と展開が安上がりですが、ソリッドな .7z は 1 ファイルに到達するために数ギガバイトをデコードしなければならないことがあります。
RAR5もうひとつの高圧縮率な Windows 系アーカイバで、52 61 72 21 1A 07 01 00 で始まります。真正面から競合していて、実務上の違いは、7z が公開されていて自由に実装できるのに対し RAR は独占的であること、そして RAR にはリカバリレコードがあり 7z には無いことです。
Self-extracting .exe7-Zip の SFX アーカイブは Windows の実行ファイルにアーカイブを追記したものなので、オフセット 0 は 4D 5A(MZ)と読め、37 7A BC AF 27 1C の署名はファイルのずっと奥に座っています。署名を走査して探す 7z リーダーなら問題なく展開できますし、.exe をアーカイブとして安全に開けるのはそのためです。

よくある壊れ方

  • 途中切れ。ZIP のときよりはるかに深刻です。先頭 32 バイトにある next header offset がファイル末尾より先を指してしまうので、一覧すら出せません。しかも ZIP と違って前方に走査すべきファイルごとのローカルヘッダがありません。.7z にはそもそも存在しないからです。部分復旧はたいてい、コーダチェーンを手で推測する作業になります。
  • オフセット 8 のスタートヘッダ CRC の失敗。先頭 32 バイトが壊れているということで、実務上これはほぼ必ず、その場でビットが反転したのではなく前にバイトが付いたか削られたかを意味します。あのブロックは小さく、めったに触れられないからです。
  • ソリッド圧縮による局所的な破損の増幅。既定では多数のファイルが 1 本の連続したストリームとして圧縮されるので、ソリッドブロックのどこか 1 バイトが壊れると、そのブロック内でそれより後ろのファイルがすべて失われます。ソリッドモードを無効にして作ったアーカイブは、まさにこの封じ込めと引き換えに圧縮率を差し出しています。
  • 暗号化されたヘッダを破損と取り違えるケース。ヘッダ暗号化ありで作られたアーカイブは、パスワードなしにはファイル名の一覧すら出せないので、ツールは読めないと報告するか、何も表示しません。アーカイブは完全に無傷で、答えることを拒んでいるだけです。
  • テキストモード転送。32 バイトの署名ヘッダは生き残るので、アーカイブは正しく認識されヘッダのポインタも解決します。失敗が現れるのは、packed streams を実際にデコードしたときの CRC エラーとしてだけです。

この形式の現在地

7z は主流のデスクトップ向けアーカイバの中では圧縮率の王者で、Windows では ZIP が大きすぎるときに手が伸びる先です。ソリッドブロックを使った LZMA2 は、ソースツリーや文書のまとまりに対して ZIP の出力を日常的に半分にしますし、AES-256 の暗号化も後付けではなく最初から組み込まれています。仕様は公開されていてリファレンス実装も自由に使えるので、libarchive も p7zip もたいていのアーカイブツールも読めます。ならなかったのは交換形式です。Unix のパーミッションやシンボリックリンクを一級で扱うモデルが無く、ソリッド圧縮のせいで 1 ファイルだけの展開が非常に高くつくことがあり、ファイルごとのヘッダが皆無なので壊れたアーカイブは壊れた ZIP よりずっと救いにくくなります。Unix で同じ仕事をするのは tar.xz や tar.zst で、こちらはパーミッションのモデルを tar の層に残します。そして相手が誰か分からないまま開いてもらうものについては、今も ZIP が安全な答えです。

7-Zip ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

7-Zip と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
ZIP50 4B 03 04.zip
RAR552 61 72 21 1A 07.rar
XZFD 37 7A 58 5A 00.xz
Zstandard28 B5 2F FD.zst

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

7-Zip かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。