2011-04-26 112 views
10

我在这里阅读了几个帖子,关于在每个java .class文件开头的幻数0xCAFEBABE,想知道为什么需要 - 这个标记的目的是什么?
它还是需要吗?还是仅仅为了向后兼容?为什么我们在.class文件的开头需要一个幻数?

无法发现回答了这个帖子 - 我也没有看到答案在Java spec

+1

为什么你在意.class文件中的内容? .class文件被编译,你应该只关心.java文件。 – Nik 2011-04-26 21:10:12

+1

是的,从来没有真正需要虚拟机工作,它只是被添加到能够区分Java类文件和其他类型的文件,即使文件的名称是未知的。 (尽管如此,虚拟机并没有使用它。) – 2011-04-27 00:17:07

+2

@Nik - 这是一个出于兴趣而提出的问题 - 我遇到了一个我不熟悉的术语,在阅读完该术语后,我对此感到困惑不解。这不像我现在要写一个'.class'文件解析器...... – RonK 2011-04-27 04:54:36

回答

8

幻数基本上是文件格式的标识符。例如,JPEG总是以FFD8开头。它本身不是必需的,它只是帮助识别文件类型。你可以阅读更多关于幻数here

+0

如果Java不需要它 - 为什么当.class文件不是真正的类时,我们会得到“Bad magic number”错误? – RonK 2011-04-27 03:59:56

+0

@RonK:这是一个额外的健全检查。每个Java编译器都会在类文件的前面放入正确的幻数,如果缺少,则会出现错误。有点像校验和,如果你想,但我不太喜欢这个比较。 – Demento 2011-04-27 10:35:10

3

参见:http://www.artima.com/insidejvm/whyCAFEBABE.html

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

一些答案:

嗯,他们大概不得不挑选 东西作为他们的幻数 识别类fil ES,并有一个 限制,你能拿出 多少Java或咖啡 相关的词只使用字母AF :-)

-

至于为何一个神奇的数字是 3405691582(0xCAFEBABE),以及我的猜测 是,(一)32位的幻数是 更容易处理,更可能是 独特,和(b)在Java团队希望 东西与Java咖啡 隐喻,因为没有'J'或十六进制的'V',结算为 ,其中有CAFE。我猜 他们认为“CAFE BABE”比“A FAB CAFE”或 “CAFE FACE”之类的东西更性感 ,并且肯定没有 像“CAFE A FAD”的含义(或更糟糕的是,“A BAD咖啡店”)。

-

不知道为什么我之前错过了这一点, 但他们可以已经使用了数 12648430,如果你选择读取 六角零作为字母“O ”。那 给你0xC0FFEE,或0x00C0FFEE到 指定所有32位。 OO咖啡?面向对象,当然 ... :-)

-

我最初看到0xCAFEBABE由NeXTSTEP的使用魔法 数。 NX使用“fat 二进制文件”,其基本上是 二进制文件,将不同平台的 一起粘在一个可执行文件中。如果你在NX Intel上运行 ,那么运行Intel二进制代码将会运行 ;如果在HP上,它将运行HP二进制文件。0xCAFEBABE 被神奇号码区分为 英特尔或摩托罗拉 二进制文件(不记得是哪个)。

3

Magic numbers是使事物(如文件)可识别的常用技术。

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

2

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