Я разрабатываю формат файла и хочу сделать все правильно. Поскольку это двоичный формат, самый первый байт (или байты) файла не должен образовывать допустимые текстовые символы (как в заголовке файла 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 инструмент может определить, что это читаемый текстовый файл. Это неверно, и идея начать файл с нетекстурной байтовой последовательности пришла от Энди Макфаддена « Разработка форматов файлов ».
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
и т.п. являются непечатными байтами.GIF8
. Файл SGI MOVI начинается сMOVI
. Один стиль файла архива zip начинается сZZ
более популярного формата pkzipPK
. Ограничение на то, что первый байт будет недопустимым текстовым символом, похоже, не соответствует тому, что найдено в wild. Мне любопытно, почему это требование.Ответы:
0xDC 0xDC
источник
0x00
или что-то еще, но операционист не хотел этого.В UTF-8 байты C0, C1 и F5 - FF недопустимы. Первый байт должен быть либо ASCII, либо байтом в диапазоне C2-F4, любой другой начальный байт не является допустимым UTF-8.
В UTF-16 файл обычно начинается с метки порядка байтов (U + FEFF), в противном случае приложения должны угадывать порядок байтов. Кодовые точки в диапазоне D800-DBFF являются ведущими байтами для суррогатной пары, а DC00-DFFF являются конечными байтами для суррогатной пары.
Таким образом, я бы использовал байтовую комбинацию
F5DC
. Эти два значения:Если вам нужно больше вариантов,
F5DD
через , чтобыF5DF
все они имеют те же 3 свойства, как и уF6DC
-F6DF
,F7DC
-F7DF
иF8DC
-F8DF
, в общей сложности 16 различных байт комбо , чтобы выбрать из.источник
0xDC
будет ли действительным UTF-8?0xDC
- ведущий байт UTF-8 для двухбайтовой последовательности. За ним должен следовать10xxxxxx
байт продолжения, чтобы он был действительным.0xDC
не является действительным байтом продолжения, поэтому0xDC 0xDC
не является допустимым UTF-8.80
-BF
.Если вы пытаетесь использовать непечатаемый символ для обозначения «не текст», то вам будет трудно победить 0x89:
Как правило, когда вы формируете магические числа, «нетекст» является второстепенной точкой. Мне придется поискать ссылку, но один из стандартных графических форматов (я думаю, TIFF) содержит что-то вроде шести разных частей полезной информации из своего магического числа.
источник