我正在设计一种文件格式,所以我想正确地做。既然是二进制格式,该文件的第一个字节(或字节)应不形成有效的文本字符(就像在PNG文件头1)。这使得无法识别格式的工具通过查看前几个字节仍然可以看到它不是文本文件。
上面的任何代码点0x7F
都是无效的US-ASCII,因此很容易。但是对于Unicode则完全不同。除了有效的Unicode字符有私用字符,noncharacters和哨兵,我在发现Unicode的私用字符,Noncharacters和哨兵常见问题解答。
我可以在文件开头使用什么样的前哨字节序列,从而导致无效的US-ASCII,UTF-8,UTF-16LE和UTF-16BE?
- 显然,第一个字节不能具有低于
0x80
此值的值,因为该值将是有效的US-ASCII(控制)字符,因此0x00
无法使用。 - 另外,由于专用字符是有效的Unicode字符,所以我也不能使用这些代码点。
- 由于它必须同时使用Little-endian和Big-endian UTF-16,因此也不能使用非字符,
0xFFFE
因为其反向0xFEFF
是有效的Unicode字符。 - 上面提到的常见问题解答建议不要使用任何非字符,因为这仍然会导致有效的Unicode序列,因此,类似的东西
0xFFFF
也无法使用。
让我使用的面向未来的前哨值是什么?
1)PNG格式的第一个字节为非ASCII 0x89
值,其后为字符串PNG
。读取PNG的前几个字节的工具可能会确定它是二进制文件,因为它无法解释0x89
。另一方面,GIF文件直接以有效且可读的ASCII字符串GIF
开头,后跟另外三个有效ASCII字符。对于GIF,工具可能会确定它是可读的文本文件。这是错误的,并且以非文本字节序列启动文件的想法来自Andy McFadden的“ 设计文件格式”。
GIF8
。SGI movi文件以开头MOVI
。一种样式的zip存档文件开始于ZZ
,另一种流行的pkzip格式的开始于PK
。第一个字节为无效文本字符的约束似乎与在野外发现的不匹配。我很好奇为什么这是必要条件。
Since it is a binary format, the first bytes of the file should not form valid textual characters
-您应该查看魔术文件(在许多Unix系统上为/ usr / share / magic或/ etc / magic),该文件显示了此应用程序如何识别文件类型。一个PNG文件开始于\x89PNG\x0d\0a\x1a\x0a
-请注意其中的“ PNG”,这是一个原始字符串。序列\x89
等是不可打印的字节。