Ruslan López Asked: 2020-12-03 09:07:43 +0800 CST 2020-12-03 09:07:43 +0800 CST 2020-12-03 09:07:43 +0800 CST 如何找到神奇数字 0xCAFEBABE? 772 我听说 Java 类在其标头中有一个称为幻数的东西来标识它们,它表示类似0xCAFEBABE. 有人可以向我解释如何检查这些信息吗? java 2 Answers Voted Best Answer Jorgesys 2020-12-03T09:16:36+08:002020-12-03T09:16:36+08:00 关于你的问题,当你用十六进制编辑器打开一个 .class 文件时,如果它包含这个幻数,你可以看到“cafe babe”。 事实上,我在这里找到了詹姆斯·高斯林本人的解释 我们过去常去一个叫 St Michael's Alley 的地方吃午饭。根据当地的传说,在黑暗的过去,感恩死者曾经在那里玩耍,在他们成名之前。这是一个相当现代的地方,不愧是乐队的名字(一个值得去死的地方)。帮派头目杰瑞死后,他们竖起了一座小佛坛。当我们去那里时,我们曾经称这个地方为“Cafe Dead”。有人注意到这是一个十六进制数。我正在修改类文件格式代码并且需要一些神奇的数字:一个用于持久对象文件,一个用于类。我将 CAFEDEAD 用于持久对象文件,并在前 4 位数字“CAFE”中寻找一个模式,并在其他数字中寻找一个变体,BABE 浮现在脑海中,我使用了它。在当时,它似乎并不太重要,也没有注定像历史的垃圾桶那样去任何地方。所以 CAFEBABE 成为类文件格式,CAFEDEAD 成为持久对象文件格式,但随着时间的推移,持久对象随着 CAFEDEAD 的使用而消失,被 RMI 取代。” 前 4 个字节是“幻数”, 0x咖啡宝贝, 识别一个有效的类文件。 接下来的 2 个字节的次要版本号标识正在使用的 .class 的版本。 接下来的 2 个字节的主要版本号 J2SE 8 = 52(0x34 十六进制), J2SE 7 = 51(0x33 十六进制), J2SE 6.0 = 50(0x32 十六进制), J2SE 5.0 = 49(0x31 十六进制), JDK 1.4 = 48(0x30 十六进制), JDK 1.3 = 47(0x2F 十六进制), JDK 1.2 = 46(0x2E 十六进制), JDK 1.1 = 45(0x2D 十六进制)。 dwarandae 2020-12-03T09:18:30+08:002020-12-03T09:18:30+08:00 由于源代码编译过程,幻数出现在所有 .class 文件的开头。使用简单的文本编辑器(如 Windows 上的记事本)可以观察到这一点,或者使用任何十六进制文本编辑器(如 Notepad++)也可以使用 GNU/Linux 操作系统中的通用编辑器(如 gedit、nano 或 vi)打开文件。
关于你的问题,当你用十六进制编辑器打开一个 .class 文件时,如果它包含这个幻数,你可以看到“cafe babe”。
事实上,我在这里找到了詹姆斯·高斯林本人的解释
前 4 个字节是“幻数”,
识别一个有效的类文件。
接下来的 2 个字节的次要版本号标识正在使用的 .class 的版本。
接下来的 2 个字节的主要版本号
由于源代码编译过程,幻数出现在所有 .class 文件的开头。使用简单的文本编辑器(如 Windows 上的记事本)可以观察到这一点,或者使用任何十六进制文本编辑器(如 Notepad++)也可以使用 GNU/Linux 操作系统中的通用编辑器(如 gedit、nano 或 vi)打开文件。