ファイルのマジックナンバーとは?フォーマット検出の仕組みを解説
2026年4月24日公開 · 約6分で読めます
OS はどうやってファイルの種類を判別するのか?
PNG ファイルを .txt にリネームしても、macOS の Quick Look は画像として正しくプレビューします。Linux で file renamed.txt を実行しても、出力は PNG image data のまま。ファイル名は変わったのに、フォーマットが変わらないのはなぜでしょうか?
OS はフォーマット判定にファイル名を一切使わないからです。代わりにファイル先頭の固定バイト列を読み取ります。これがマジックナンバー(ファイルシグネチャとも呼ばれます)です。
Windows エクスプローラー、macOS Finder、ブラウザの MIME スニッフィング — すべて同じ仕組みです。先頭バイトを読み、既知のシグネチャと照合し、結論を出します。
マジックナンバーとは?
すべてのファイルフォーマットは、ファイル先頭に型を宣言するための固定バイト列を予約しています。これがマジックナンバー(ファイルシグネチャ、ファイルヘッダーとも)です。
パスポートに例えると、入国審査で名前を聞くのではなく、パスポートの最初のページを開いて国籍を確認するのと同じです。マジックナンバーはファイルの「パスポート1ページ目」。ファイル名がなんであれ、先頭バイトが真実を語ります。
これは Unix の file コマンドの動作原理そのものです。バイトパターンの magic データベースを持ち、拡張子に頼らずマッチングします。Windows エクスプローラー、macOS Finder、ブラウザの MIME スニッフィングもすべて同じです。ファイルの種類は内容で決まり、名前では決まりません。
マジックナンバー速引き表
実務でよく出会うフォーマットのシグネチャ一覧です:
| フォーマット | マジックバイト (Hex) | ASCII 表現 | 備考 |
|---|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | ‰PNG.... | 8 バイト、最も認識しやすいシグネチャの一つ |
| JPEG | FF D8 FF | — | 3 バイト。3 バイト目はサブタイプにより異なる |
| GIF | 47 49 46 38 | GIF8 | 37(GIF87a)または 39(GIF89a)が続く |
| 25 50 44 46 | %PDF | バージョン番号が続く(例:-1.7) | |
| WebP | 52 49 46 46 … 57 45 42 50 | RIFF…WEBP | RIFF コンテナ。バイト 8–11 を確認 |
| WAV | 52 49 46 46 … 57 41 56 45 | RIFF…WAVE | RIFF コンテナ。サブタイプは WAVE |
| MP3 | 49 44 33 / FF Fx | ID3 / sync | ID3 タグあり:先頭 ID3、タグなし:同期ワード FF Ex または FF Fx |
| FLAC | 66 4C 61 43 | fLaC | ロスレスオーディオ、曖昧さのないシグネチャ |
| MP4 / MOV / M4A | 00 00 00 xx 66 74 79 70 | ....ftyp | ftyp コンテナ。バイト 8–11 のブランドを確認 |
| WebM | 1A 45 DF A3 | — | EBML コンテナヘッダー |
| OGG | 4F 67 67 53 | OggS | OGG オーディオ/ビデオコンテナ |
| BMP | 42 4D | BM | Windows ビットマップ |
落とし穴:先頭 4 バイトだけでは足りない
2 つのコンテナファミリは、まったく異なるメディアタイプなのに共通のプレフィックスを持っています。4 バイト目で止めると誤判定になります。
RIFF コンテナ(WebP / WAV / AVI)
WebP、WAV、AVI はいずれも RIFF(52 49 46 46)で始まります。実際のサブタイプはバイト 8–11 にあります:
ftyp コンテナ(MP4 / MOV / M4A)
MP4、MOV、M4A は先頭 4 バイトが可変のボックスサイズ、バイト 4–7 が固定の ftyp。バイト 8–11 のブランドコードが実際のフォーマットを決定します:
主なブランドコード:isom / iso2 / avc1 = MP4、M4A = M4A(Apple オーディオ)、qt = QuickTime MOV。
実践:file コマンドでマジックナンバーを読む
macOS と Linux では、file コマンドがファイル名ではなくマジックナンバーを読んでフォーマットを判定します:
# macOS / Linux
$ file -b photo.png
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced
$ file -b photo.txt # 拡張子を .txt に変更
PNG image data, 617 x 875, 8-bit/color RGBA, non-interlaced file は macOS と Linux の組み込みツールです。Windows にはネイティブの同等コマンドはありません。
コードで同じ検出を実装するなら、コアロジックは JavaScript 数行で済みます:
// Base64 文字列の先頭 24 文字を取得(atob デコード後 = 18 バイト)してフォーマット検出
// (Base64 4 文字 = 3 バイト)
const b64 = "iVBORw0KGgoAAAANSUhEUgAA...";
const bin = atob(b64.slice(0, 24));
const hex = [...bin]
.map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
.join(" ");
console.log(hex);
// → 89 50 4e 47 0d 0a 1a 0a ... (PNG) 速引き表と照合:89 50 4e 47 → PNG、ff d8 ff → JPEG、25 50 44 46 → PDF。
まとめ
ファイルの種類はバイナリ先頭のマジックバイトで決まり、ファイル名や拡張子とは無関係です。先頭バイトを読み取り、既知のシグネチャと比較するだけで、コンテキストなしにフォーマットを特定できます。
ファイル名を変えても OS を欺けない理由 — それはマジックナンバーを読むすべてのツールに共通です。
関連記事
JSON API レスポンス内の Base64 画像をデバッグする方法 →ViewJSON は JSON 内のすべての文字列にマジックナンバー検出を適用し、Base64 画像・音声・動画をインラインプレビューします。
今すぐ試す
Base64 を含む JSON を貼り付けるだけ。ViewJSON がフォーマットを自動検出し、画像・音声・動画をインラインで表示します。
ViewJSON を開く →