如何为我的文件格式选择一个好的幻数?

时间:2010-08-25 12:53:38

标签: file file-format magic-numbers

我正在从头开始设计二进制文件格式,我希望在开头包含一些魔术字节,以便可以轻松识别它。我该如何选择哪个字节?我不知道魔法数字的任何中央注册表,所以它只是选择一个相当随机的东西,而不是已经通过附近的UNIX盒子上的文件命令识别出来了吗?

2 个答案:

答案 0 :(得分:20)

远离超短魔法数字。仅仅因为您正在设计二进制格式并不意味着您不能使用文本字符串作为标识符。通过EOF字符跟随它,并且作为额外的奖励, cat type 的人你的二进制文件将不会得到损坏的终端。

答案 1 :(得分:0)

没有普遍正确的方法。可以建议最佳实践,但这些通常视情况而定。例如,如果您正在检查易失性存储器的完整性,当加电时它具有未定义的初始状态,那么将许多 0 或 1 合并到一个可以突出的序列(即 FFF0 00FF F000)中可能是有益的对抗随机噪声。

如果文件主要是二进制文件,一个流行的选择是使用像 ASCII 这样的文本编码,它在十六进制编辑器的二进制数据中脱颖而出。例如,GIF 使用 GIF89a,FLAC 使用 fLaC。另一方面,在随机文本文件中可能会错误地检测到纯文本标识符,因此可能会包含无效/控制字符。

一般来说,它们是什么并不重要,即使是一堆NULL字节也可以用于文件检测。但理想情况下,您需要您能承受的最长的唯一标识符,并且长度至少为 4 个字节。任何 4 字节以下的标识符将更频繁地出现在随机数据中。时间越长,被检测为误报的可能性就越小。一些已知示例长达 40 个字节。在某种程度上,它就像一个密码。

此外,它不必位于偏移量 0。文件签名通常位于偏移量零处,因为如果首先处理它,首先存储它是有意义的。

也就是说,单个文件签名不应该是唯一的防线。即使签名匹配,实际的解析过程本身也应该能够验证完整性并清除无效文件。这可以通过附加文件签名、使用长度敏感数据、值/范围检查,尤其是哈希/校验和值来完成。