Блог

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

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

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

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

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

Проводник Windows, Finder macOS, MIME-снифинг браузера — все используют один подход: прочитать первые байты, сравнить с известными сигнатурами и сделать вывод.

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

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

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

Именно так работает команда file в Unix: она хранит базу данных magic с шаблонами байтов и сравнивает с ними — без расширений. Проводник Windows, Finder macOS и 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.

Итоги

Тип файла определяется магическими байтами в начале двоичного содержимого — не именем и не расширением. Достаточно прочитать первые байты, сравнить с известными сигнатурами, и можно идентифицировать любой формат без дополнительного контекста.

Вот почему переименование файла не обманывает ОС — и любой инструмент, который читает магические числа.

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

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

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

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

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

Открыть ViewJSON →