Как создаются форматы файлов?Если все это в двоичном виде, как кодирование меняет тип файла? - PullRequest
1 голос
/ 13 июля 2010

Я прочитал несколько ссылок на тему форматов файлов и кодировки, но как это сделать?

Если все данные являются двоичными, что разбивает данные на различные форматы файлов?Что именно включает в себя кодирование данных?Как это сделать?

Ответы [ 4 ]

3 голосов
/ 13 июля 2010

Согласно ответу театра, все зависит от толкования.

Обычно расширение файла (.txt, .jpg, .pdf и т. Д.) Предоставляет достаточно информации, чтобы определить, какая программа должна обрабатывать файл - и тогда программа будет знать, как обрабатывать заданный формат (или создавать этот формат, когда сохранение в этот конкретный тип файла).

Каждый формат файла имеет (надеюсь!) Четко определенный формат, например, файл PDF всегда будет начинаться со строки, которая гласит «% PDF-x.y», где x.y - номер версии, например, 1.6. что позволяет аналогам Acrobat определить, что это «скорее всего файл PDF», и решить, как с ним работать (разные версии будут иметь разную внутреннюю структуру).

.txt файлы обычно представляют собой просто последовательности «символов», закодированных особым образом - простой английский текст легко кодируется, более сложные языки с тысячами символов требуют более сложных кодировок (Unicode или UTF-8, причем последний является «сжатая» форма Unicode).

Попробуйте открыть несколько некритических файлов в шестнадцатеричном редакторе, попробуйте получить некоторые спецификации формата и посмотрите, что вы можете найти!

2 голосов
/ 13 июля 2010

Форматы файлов описывают данные в определенном представлении. Например, jpeg, bmp, png и tiff все описывают изображения, тогда как html и rtf описывают текстовые документы.

Формат файла состоит из заголовка, который описывает информацию о содержащихся данных (размеры изображения, имя сжатого файла и т. Д.). Они будут содержать идентифицирующие подписи, которые обозначают файл определенного типа:

  • Исполняемые файлы Windows начинаются с 'MZ'
  • JPEG-изображения имеют JFIF в первых 20 байтах или около того (не могу вспомнить точное смещение)
  • HTML-документы имеют <html (верхний или нижний регистр) в начале документа

Это концепция Unix file и libmagic API.

Кодировка текста - это набор символов, в котором закодирован текст. Это потому, что программы исторически используют однобайтовые массивы (char * в C / C ++) для представления строк, и этого недостаточно для представления большинства человеческих языков. Кодировка текста говорит, что «этот текст - упрощенный китайский» или «этот текст - кириллица».

Способ выбора текстовых кодировок зависит от используемого формата файла. Форматы простого текста (text, html, xml) могут иметь в начале «метку порядка байтов», которая идентифицирует этот текст как UTF-32 (с прямым или прямым порядком байтов), UTF-16 (с прямым или прямым порядком байтов) или UTF-8. Это разные представления символов Юникода.

XML позволяет указать кодировку в объявлении <?xml?> - например, <?xml version="1.0" encoding="ShiftJIS"?>. HTML позволяет указывать кодировку в теге <meta> - например, <meta http-equiv="Content-Type" content="text/html; charset=utf-8">.

Вы можете увидеть примеры, где текст кодируется в одной форме, но декодируется как другая (текст искажен) в некоторых электронных письмах или других местах. Они будут выглядеть как • (это символ маркера (средняя черная точка), закодированный в utf-8) - вы можете увидеть это в Firefox, перейдя в меню View > Character encoding и изменив кодировку на Western (ISO-8859-1) (особенно для незападных персонажей).

Вы также можете использовать другие типы кодирования. Например, электронная почта может быть упакована в base64 во время транспортировки.

1 голос
/ 13 июля 2010

Основные способы определения формата - по расширению файла или по типу 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).

1 голос
/ 13 июля 2010

Все данные являются двоичными, включая эту веб-страницу, которую вы просматриваете прямо сейчас.Значение интерпретации данных имеет значение.

Например, представьте, что у вас есть четыре байта:

0xaa 0x00 0x00 0x55

Это может быть (в произвольном порядке):

  1. Число 43520, за которым следует число 85
  2. Десятичное число 170, за которым следует 21760
  3. Десятичное число 2852126805
  4. Сотни других интерпретаций

И это только цифры без знака.Любой из этих байтов или битов может быть маркерами, индикаторами порядка, строками, индикаторами положения и т. Д.

...