ブログ

ファイルのマジックナンバーとは?フォーマット検出の仕組みを解説

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)が続く
PDF 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 はいずれも RIFF52 49 46 46)で始まります。実際のサブタイプはバイト 8–11 にあります:

+0
RIFF
共通プレフィックス
+4
ファイルサイズ (4 バイト)
+8
サブタイプ WEBP / WAVE / AVI
実際のフォーマット
+12
チャンクデータ

ftyp コンテナ(MP4 / MOV / M4A)

MP4、MOV、M4A は先頭 4 バイトが可変のボックスサイズ、バイト 4–7 が固定の ftypバイト 8–11 のブランドコードが実際のフォーマットを決定します:

+0
ボックスサイズ (可変)
+4
ftyp
固定マーカー
+8
ブランド isom / M4A / qt
実際のフォーマット
+12
互換リスト

主なブランドコード: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 を開く →