13

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

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

4

4 回答 4

9

幻数基本上是文件格式的标识符。例如,JPEG 总是以 FFD8 开头。Java 本身不需要它,它只是帮助识别文件类型。您可以在此处阅读有关幻数的更多信息。

于 2011-04-26T21:13:41.993 回答
4

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

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

一些答案:

好吧,他们大概不得不选择一些东西作为他们的幻数来识别类文件,并且只使用字母 AF 可以想出多少与 Java 或咖啡相关的词是有限度的 :-)

-

至于为什么幻数是 3405691582 (0xCAFEBABE),我的猜测是 (a) 32 位幻数更容易处理并且更有可能是唯一的,并且 (b) Java 团队想要 Java-coffee 的东西隐喻,并且由于十六进制中没有“J”或“V”,因此选择了包含 CAFE 的东西。我猜他们认为“CAFE BABE”比“A FAB CAFE”或“CAFE FACE”更性感,而且绝对不喜欢“CAFE A FAD”(或更糟,“A BAD CAFE”)的含义。

-

不知道为什么我之前错过了这个,但如果您选择将十六进制零读作字母“O” ,他们可能会使用数字 12648430。这为您提供了 0xC0FFEE 或 0x00C0FFEE 来指定所有 32 位。哦咖啡?面向对象,当然... :-)

-

我最初将 0xCAFEBABE 视为 NeXTSTEP 使用的幻数。NX 使用了“胖二进制文件”,它们基本上是针对不同平台的二进制文件,它们放在一个可执行文件中。如果您在 NX Intel 上运行,它将运行 Intel 二进制文件;如果在 HP 上,它将运行 HP 二进制文件。0xCAFEBABE 是区分英特尔或摩托罗拉二进制文件的神奇数字(不记得是哪个)。

于 2011-04-26T21:11:14.847 回答
3

幻数是一种使文件(例如文件)可识别的常用技术。

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

于 2011-04-26T21:13:59.880 回答
2

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

于 2011-04-26T21:14:02.040 回答