Основные способы определения формата - по расширению файла или по типу MIME, а реже - по «магическим числам».Расширение файла будет проверено ОС или Приложением, чтобы решить, что с ним делать (какое приложение для его запуска или какая часть кода для него выполняется).
MIME-типы используются там, где расширение(или имя файла) не всегда применимо - например, при загрузке файла по HTTP, URI для файла может выглядеть примерно так: ~.php?id=12973
.Тип файла не может быть определен исходя из этого, но протокол HTTP отправит определение «Content-Type», чтобы сказать, в каком формате находится файл, и браузер будет обрабатывать его правильно.Например: Content-Type: image / png вынудит браузер передать файл какой-либо функции декодирования PNG.
Когда приложение знает, что это за формат файла, оно передаст данные в код, которыйнаписано специально для этого формата.Если у программы нет кода для чтения формата, она не сможет его прочитать.
Способ кодирования файла зависит от конкретного файла.Большинство стандартных форматов будут иметь спецификацию, описывающую их двоичное кодирование, и любое приложение, читающее этот тип файла, должно реализовать код, соответствующий спецификации.(Хотя обычно это делается с помощью библиотеки, которая уже выполняет чтение для вас).
Чтобы привести пример работы двоичных кодировок, рассмотрим изображение.В спецификации может быть сказано, что байты 10-13 обозначают ширину изображения, а байты 14-17 обозначают высоту изображения.Чтобы прочитать эти фрагменты информации из файла, код должен явно прочитать данные правильного размера в правильных местах, указанных в спецификации.Например: fseek(f, 10, SEEK_SET); fread(&width, 4, 1, f); //Read 4 bytes at location 10 into "width")
.Я думаю, что ваша путаница заключается в том, «что разделяет фрагменты данных в двоичных файлах?»(т. е. в текстовых файлах это можно сделать с помощью новых строк, пробелов, значений, разделенных запятыми (CSV) и т. д.).Ответ таков: обычно размер данных определяет, где они заканчиваются - спецификация скажет, каков двоичный тип каждого поля (возможно, он может сказать int32, указывая 32 бита / 4 байта).
Otherкроме этого, могут быть неоднозначности в форматах файлов, но обычно это происходит с текстовыми файлами, где текст внутри может быть прочитан, чтобы определить формат.Это не всегда применимо, потому что часто текстовый файл просто имеет расширение «.txt», поэтому приложению может быть неизвестно, какова кодировка символов текста.(Это было и остается проблемой для приложений, которые не используют Unicode).