Что такое 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) |
| 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:
Контейнер ftyp (MP4 / MOV / M4A)
MP4, MOV и M4A начинаются с переменного 4-байтного размера бокса, затем ftyp в байтах 4–7. Код бренда в байтах 8–11 определяет фактический формат:
Основные коды брендов: 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 →