Блог

Что такое Magic Number файла? Определение формата объяснено

Опубликовано 24 апреля 2026 · 6 мин чтения

Как ОС определяет тип файла?

Переименуйте PNG в .txt. Quick Look на macOS всё равно покажет изображение. Выполните file renamed.txt в Linux — вывод по-прежнему PNG image data. Имя изменилось, а формат — нет. Почему?

Потому что многие определители формата проверяют байты самого содержимого — магическое число или файловую сигнатуру — а не только имя файла.

Расширение по-прежнему влияет на ассоциацию и открытие файла. Такие инструменты, как <code>file</code>, и некоторые MIME-пути тоже проверяют байты, но правила у них различаются.

Что такое магическое число?

Каждый формат файла резервирует фиксированную последовательность байтов в начале файла для объявления своего типа. Они называются магическими числами (также известны как файловые сигнатуры или заголовки файлов).

Представьте паспорт: на границе не спрашивают ваше имя — открывают первую страницу и подтверждают гражданство. Магическое число — это «первая страница» файла. Как бы файл ни назывался, первые байты говорят правду.

Команда Unix file сравнивает содержимое с базой magic шаблонов байтов. Это даёт сведения о формате, но не заменяет MIME, метаданные контейнера и правила конкретного инструмента.

Краткий справочник Magic Numbers

Распространённые сигнатуры форматов, с которыми вы столкнётесь на практике:

Формат Magic Bytes (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-м байте даст неверный результат.

Контейнер RIFF (WebP / WAV / AVI)

WebP, WAV и AVI начинаются с RIFF (52 49 46 46). Фактический подтип находится в байтах 8–11:

+0
RIFF
общий префикс
+4
размер файла (4 байта)
+8
подтип WEBP / WAVE / AVI
реальный формат
+12
данные чанка

Контейнер ftyp (MP4 / MOV / M4A)

MP4, MOV и M4A начинаются с переменного 4-байтного размера бокса, затем ftyp в байтах 4–7. Код бренда в байтах 8–11 определяет фактический формат:

+0
размер бокса (переменный)
+4
ftyp
фиксированный маркер
+8
бренд isom / M4A / qt
реальный формат
+12
список совместимости

Основные коды брендов: isom / iso2 / avc1 = MP4, M4A = M4A (Apple аудио), qt = QuickTime MOV.

Попробуйте: команда file читает Magic Numbers напрямую

В 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:

// Читаем первые 18 байт строки Base64 для определения формата
// (каждые 4 символа Base64 = 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.

Итоги

Магические байты — сильная подсказка о бинарном формате, но не универсальная система типов. Учитывайте сигнатуру, объявленный MIME, метаданные контейнера и правила конкретного инструмента.

Переименование не меняет байты, поэтому определители по содержимому могут узнать исходный формат; ассоциации по имени могут работать иначе.

Связанная статья

Как отладить Base64-изображения в JSON-ответах API →

ViewJSON применяет детекцию магических чисел к каждой строке в вашем JSON — Base64-изображения, аудио и видео отображаются как встроенные превью автоматически.

Попробуйте сейчас

Вставьте любой JSON с Base64-содержимым — ViewJSON автоматически определит формат и покажет изображения, аудио и видео прямо в интерфейсе. Без ручного декодирования.

Открыть ViewJSON →