Я разрабатываю формат файла и хочу сделать все правильно. Поскольку это двоичный формат, самый первый байт (или байты) файла не должен образовывать допустимые текстовые символы (как в заголовке файла PNG 1 ). Это позволяет инструментам, которые не распознают формат, по-прежнему видеть, что это не текстовый файл, просматривая первые несколько байтов.
Любой код, указанный выше, 0x7F
является недействительным US-ASCII, так что это легко. Но для Unicode это совсем другая история. Помимо допустимых символов Юникода, есть частные символы , нехарактеры и стражи , как я нашел в FAQ по частным персонажам , нехарактерам и часовым .
Какой будет последовательность байтов, которую я могу использовать в начале файла, что приведет к неправильным US-ASCII, UTF-8, UTF-16LE и UTF-16BE?
- Очевидно, что первый байт не может иметь значения ниже,
0x80
поскольку это будет действительный символ US-ASCII (управляющий), поэтому0x00
его нельзя использовать. - Кроме того, поскольку символы частного использования являются допустимыми символами Unicode, я не могу использовать эти кодовые точки.
- Так как он должен работать как с UTF-16 с прямым порядком байтов, так и с прямым порядком байтов, такой символ , который не является символом ,
0xFFFE
также невозможен, так как его обратный0xFEFF
символ является допустимым символом Unicode. - Вышеупомянутые часто задаваемые вопросы предлагают не использовать какой-либо из нехарактерных символов, так как это все равно приведет к правильной последовательности Юникода, поэтому что-то вроде этого
0xFFFF
также не видно .
Каковы будут сохраняемые для будущего значения дозорных, которые я оставлю для использования?
1 ) Формат PNG имеет в качестве самого первого байта значение не ASCII 0x89
, за которым следует строка PNG
. Инструмент, который считывает первые несколько байтов PNG, может определить, что это двоичный файл, так как он не может интерпретировать 0x89
. Файл GIF, с другой стороны, начинается непосредственно с допустимой и читаемой строки ASCII, GIF
за которой следуют еще три действительных символа ASCII. Для GIF инструмент может определить, что это читаемый текстовый файл. Это неверно, и идея начать файл с нетекстурной байтовой последовательности пришла от Энди Макфаддена « Разработка форматов файлов ».
GIF8
. Файл SGI MOVI начинается с MOVI
. Один стиль файла архива zip начинается с ZZ
более популярного формата pkzip PK
. Ограничение на то, что первый байт будет недопустимым текстовым символом, похоже, не соответствует тому, что найдено в wild. Мне любопытно, почему это требование.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Вы должны посмотреть на волшебный файл (/ usr / share / magic или / etc / magic на многих системах Unix), который показывает, как это приложение идентифицирует типы файлов. Файл PNG начинается с\x89PNG\x0d\0a\x1a\x0a
- обратите внимание на «PNG», это необработанная строка. Последовательности\x89
и т.п. являются непечатными байтами.