Я сомневаюсь, что есть решение «серебряной пули» для этой проблемы. Никто не говорит, что каждый формат файла имеет какую-либо форму магического числа. Рассмотрим простые текстовые файлы - никаких разумных указаний вообще (кроме возможной метки порядка байтов в начале, которая, однако, ничего не должно значить) и чистая эвристика должны использоваться для предположения, что это простой текстовый файл. Подобно тому, как распознавать файл XML или HTML (то есть SGML), это означает проверить множество возможностей.
Подход, которому вы должны следовать:
- Сузить набор ожидаемых форматов файлов.
- Либо сделай сам, основываясь на знании общей структуры и / или характеристик форматов файлов, которые нужно поддерживать, либо найди решение, подобное Файл GNU , упомянутое rerun. Вы также можете посмотреть на такие сайты, как MagicDB - однако этот особенно устарел (2005 год).
- Укажите поведение для неожиданных форматов файлов.
В случае, если набор достаточно узок, я бы посоветовал простое пользовательское решение как правильное.