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

2022-09-04 20:00:00

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

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


答案 1

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


答案 2

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

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

一些答案:

好吧,他们可能不得不选择一些东西作为他们的幻数来识别类文件,并且仅使用字母A-F可以想出多少与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的数字。这为您提供了指定所有 32 位的0xC0FFEE或0x00C0FFEE。哎呀咖啡?面向对象,当然... :-)

-

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


推荐