问题 为什么我们在.class文件的开头需要一个幻数?


我在这里读了一些关于神奇数字的帖子 0xCAFEBABE 在每个java的开头 。类 文件,想知道 为什么 需要 - 这个标记的目的是什么?
还需要它吗?或者它现在只是为了向后兼容?

找不到回答这个问题的帖子 - 我也没有在java中看到答案 规范


3358
2018-04-26 21:08


起源

你为什么关心.class文件中的内容?编译.class文件,您应该只关心.java文件。 - Nik
是的,VM从来没有必要工作,它只是被添加到能够区分Java类文件和其他类型的文件,即使文件的名称是未知的。 (但是VM不会为此目的使用它。) - Paŭlo Ebermann
@Nik - 这是一个令人感兴趣的问题 - 我遇到了一个我不熟悉的术语,在阅读之后我对此感到困惑。这不像我要写一个 .class 文件解析器现在...... - RonK
@Nik如果您对任何字节码读取和/或操作感兴趣,那么您将对.class文件非常感兴趣。 - jbranchaud


答案:


幻数基本上是文件格式的标识符。例如,JPEG始终以FFD8开头。 Java本身没有必要,它只是帮助识别文件类型。您可以阅读有关魔术数字的更多信息 这里


8
2018-04-26 21:13



如果Java不需要它 - 当.class文件不是真正的类时,为什么我们会得到“Bad magic number”错误? - RonK
@RonK:这是一个额外的健全检查。每个java编译器都会在类文件前放置正确的幻数,如果缺少,则会出现错误。如果你愿意,有点像校验和,虽然我不喜欢这种比较。 - Demento


魔术数字 是一种常见的技术,可以识别文件等文件。

这个想法是你只需要读取文件的前几个字节,以了解这是否很可能是一个Java类文件。如果第一个字节不等于幻数,那么您肯定知道它不是有效的Java类文件。


3
2018-04-26 21:13





看到: http://www.artima.com/insidejvm/whyCAFEBABE.html

编辑:和 http://radio-weblogs.com/0100490/2003/01/28.html

一些答案:

嗯,他们可能不得不选择   作为他们神奇数字的东西   识别类文件,并且有一个   限制Java或咖啡的数量   你能想出的相关词汇   只使用字母A-F :-)

-

至于为什么神奇的数字是   3405691582(0xCAFEBABE),我的猜测   是(a)32位幻数   更容易处理,更有可能   独特的,(b)Java团队想要的   Java咖啡的东西   隐喻,因为没有'J'或   十六进制的“V”,为   其中有CAFE的东西。我猜   他们认为“CAFE BABE”更性感   比起“A FAB CAFE”或者   “CAFE FACE”,绝对没有   喜欢“CAFE A FAD”的含义   (或者更糟糕的是,“A BAD CAFE”)。

-

不知道为什么我之前错过了这个,   但他们 可以 使用了这个号码   12648430,如果你选择阅读   十六进制零作为字母'O'。那   给你0xC0FFEE或0x00C0FFEE   指定所有32位。 OO COFFEE?目的   面向当然...... :-)

-

我最初看到0xCAFEBABE是一种魔力   NeXTSTEP使用的号码。 NX用“胖子   二进制文件“,基本上是   不同平台的二进制文件卡住了   一起在一个可执行文件中。如果   你是在NX英特尔上运行的   运行Intel二进制文件;如果在HP上,它   会运行HP二进制文件。 0xCAFEBABE   是区分的神奇数字   无论是英特尔还是摩托罗拉   二进制文件(不记得哪个)。


3
2018-04-26 21:11





对于二进制文件来说,在开始时使用某种固定标识符是相当常见的做法(例如,zip文件以字符PK开头)。这减少了意外尝试将错误类型的文件解释为类文件的可能性。


2
2018-04-26 21:14