Определитель типа файла

Расширение файла — лишь ярлык: переименование virus.exe в photo.jpg ничего внутри не меняет. Эта страница читает первые байты каждого загруженного файла и сверяет их с более чем 60 настоящими магическими сигнатурами: изображения, документы, архивы, аудио и видео, шрифты, исполняемые файлы, базы данных и ключи. Вы получаете определённый тип, MIME-тип, расширения, которые обычно использует этот тип, предупреждение, когда расширение противоречит содержимому, и, где формат это содержит, сведения (размеры изображения, версию PDF, бренд MP4). Всё проверяется локально в вашем браузере.
Перетащите файлы сюда, или нажмите, чтобы выбрать их
Один файл или много. Читаются только первые 512 байт каждого; файлы никогда не покидают этот компьютер.
Файлы не выбраны.
Таблица определения появится здесь после выбора файлов и нажатия «Определить».
Что значит «совпадение»: согласованно — расширение совпадает с определённым форматом; несовпадение — содержимое относится к другому формату, чем утверждает расширение (переименованный файл или хуже); «нет сигнатуры» — первые байты не совпадают ни с одной известной сигнатурой, что нормально для простого текста, CSV и большинства форматов данных без заголовка. Приватность: файлы читаются встроенным FileReader браузера; ничего не загружается.

Что такое сигнатура файла?

Почти каждый двоичный формат начинается с фиксированной последовательности байтов — магического числа — которое туда поставили, чтобы программа могла узнать свои файлы, не доверяя имени. PNG всегда начинается с восьми байтов 89 50 4E 47 0D 0A 1A 0A («\x89PNG\r\n\x1a\n»), PDF — с ASCII-текста %PDF, ZIP — с PK\x03\x04 (инициалы Фила Каца, который придумал формат). Операционные системы в основном игнорируют эти байты и смотрят на расширение — именно поэтому переименованный файл нигде не «открывается нормально», и именно поэтому инструменты безопасности проверяют содержимое.

Известные первые байты

БайтыФорматПримечание
89 50 4E 47 0D 0A 1A 0AИзображение PNG\r\n защищает от порчи окончаний строк
FF D8 FFИзображение JPEGкаждый кадр JPEG начинается с маркера SOI
25 50 44 46 2DДокумент PDF«%PDF-1.7» — далее следует версия
50 4B 03 04Архив ZIPdocx/xlsx/odt/epub — это ZIP с расширением
D0 CF 11 E0Старый Officedoc/xls/ppt/msi — составной файл OLE2
4D 5AWindows EXE«MZ», по имени Марка Збиковски из Microsoft
7F 45 4C 46Linux ELF\x7fELF — программы и разделяемые библиотеки
1A 45 DF A3Matroska/WebMначало контейнера EBML
75 73 74 61 72 со смещения 257Архив TARсигнатура спрятана глубоко в заголовке

Как определитель решает

Первые 512 байт каждого файла сравниваются с таблицей сигнатур в порядке специфичности: бренды контейнеров (RIFF…WAVE против RIFF…AVI против RIFF…WEBP, бренд-боксы ISO со смещения 8) проверяются раньше своих общих контейнеров, а форматы на основе ZIP (EPUB, ODF, OOXML) — раньше обычного ZIP. Где формат несёт самоописывающие метаданные, страница заглядывает на уровень глубже: размеры PNG/GIF/BMP/JPEG/WebP читаются из их заголовков, версия PDF — с байта 5, бренд MP4 и версия класса Java — с их стандартных смещений. Файлы, которые ничему не соответствуют, проходят текстовую эвристику (BOM, <?xml, <html, shebang, доля печатных символов), прежде чем быть признаны неизвестными.

Частые ошибки

«Говорит ZIP, но файл .docx» — это верно: .docx — это ZIP-архив, первая запись которого [Content_Types].xml; определитель распознаёт этот случай и сообщает именно Office Open XML. «Говорит, что сигнатуры нет, но файл открывается нормально» — у CSV, большинства исходного кода и бесчисленных научных форматов вообще нет магических байтов; «нет сигнатуры» — не обвинение. «Может ли он сказать, безопасен ли файл?» — нет. Проверка содержимого говорит, что файл собой представляет, а не что он делает; EXE остаётся EXE, будь это установщик или вредонос.

Частые вопросы

Почему только 512 байт? — каждая поддерживаемая сигнатура лежит в первых 512 байтах (самая глубокая — ustar в TAR со смещения 257); чтение большего замедлило бы большие пакеты без пользы.
Определяет ли он длительность видео? — нет, только контейнер и его бренд; длительность требует разбора всего индекса, а это работа проигрывателя.
Сразу несколько файлов? — да, перетащите всю выборку; каждая строка определяется независимо.
Связанная страница: чтобы пойти в обратную сторону — от расширения к MIME-типу — используйте Поиск MIME-типов; чтобы хешировать те же файлы, используйте Пакетный хеш файлов.