关于 0xCAFEBABE 的秘密(文末有彩蛋)
本帖最后由 零度非安全 于 2017-1-17 16:56 编辑知道这个数值的含义请不要笑我哈{:10_297:} ,这个数值也是我昨天无意之间发现的{:10_243:} ,其实系统学习过的 JVM 的鱼油们
都知道这个数值的含义。那我是怎么无意之间发现的呢?学 Java 这么久,我都不知道 Java 源文件编译出来的 class 文件里面到底有什么东西{:10_269:}?所以我想自己一探究竟,但问题来了,我用什么软件打开这个 class 文件呢{:5_94:}?咦,记事
本,我就老老实实的用记事本随便打开一个 class 文件,丫的,这什么东西呀?一堆乱码,看不懂,如下所示:
于是乎我直接把这个 class 文件拖入到 UltraEdit,这下看上去舒服多了,嗯,没错,显示了该文件的十六进制,如下所示:
大致浏览了下,丫的,还是看不懂,伤心{:5_100:},但接下来我还是多拖入几个 class 文件试试,如下:
不知这样看你们发现了什么没有,对,没错,每个 class 文件的前面 4 个字节基本没变。 刮刮有奖{:10_256:}。
每个 class 文件的头 4 个字节都是“CAFEBABE”,即十六进制数 0xCAFEBABE,我想没这么巧吧,个个 class 文件的十
六进制都是这个数开头的,这其中一定有什么不可告人的秘密
探索继续。。。。。。
抓住这个点后,我便开始疯狂查找与关键词“0xCAFEBABE”有关的资料(其实我也是对知识的一种渴望),将查找的资料整理如下:
我们先来看一张图片
其实在这张图片里已经把这个关键词的由来说的很清楚了,说简单点,这个 0xCAFEBABE 就是为了让 JVM 识别它是一个
class 文件,并将其称为魔数(Magic Number),网上关于这个解释也很多,个人认为他们解释还不如 Java 创作者解释清楚,毕竟我们要原滋原味的,如下所示:
为了有些鱼油看不清,我就把这段话手敲下来。
James Gosling explained this:
We used to go to lunch at a place called St Michael's Alley. According to local legend, in the deep dark past, the Grateful Dead used to perform there before they made it big. It was a pretty funky place that was definitely a Grateful Dead Kinda Place. When Jerry died, they even put up a little Buddhist-esque shrine. When we used to go there, we referred to the place as Cafe Dead. Somewhere along the line it was noticed that this was a HEX number. I was re-vamping some file format code and needed a couple of magic numbers: one for the persistent object file, and one for classes. I used CAFEDEAD for the object file format, and in grepping for 4 character hex words that fit after "CAFE" (it seemed to be a good theme) I hit on BABE and decided to use it. At that time, it didn't seem terribly important or destined to go anywhere but the trash-can of history. So CAFEBABE became the class file format, and CAFEDEAD was the persistent object format. But the persistent object facility went away, and along with it went the use of CAFEDEAD - it was eventually replaced by RMI.
咳咳,对于英语基础不好的鱼油阅读起来估计有点难度,不用担心,下面我已经帮你们翻译好了(翻译的不是很好{:10_243:} )。
过去我们常常在米迦勒巷吃午饭,据当地的传说,在那深暗的过去,一些死去的人都心存感激,因为这里使他们长大,并在这里工作。这里是一个有趣的地方,绝对是一个感恩而死的地方。杰瑞死的时候,他们甚至提出了一个小小的佛教风格的神社。当我们过去去那里,那个咖啡馆不在了,消失了。沿着线的某处,人们注意到这是一个十六进制数。我需要两个神奇的数字来修补一些文件格式的代码:一个是持久对象文件,另一个是类。我用CAFEDEAD用于对象文件格式,并用grep去寻找能代表一个4个字节的十六进制的单词,“咖啡馆”这个单词非常适合(这似乎是一个很好的主题),但我想到了宝贝(BABE),并决定用它。由于不堪的历史原因,并没有显得特别重要或注定要去任何地方,所以CAFEBABE成为类文件格式,和CAFEDEAD成为持久对象的格式。但是后来持久对象消失了,那么CAFEDEAD自然而然也消失了- 最终取代它的是RMI。
我们就这样结束了吗?然而并没有,鱼油们不妨将十六进制数 0xCAFEBABE 转化为十进制数看看,看看你们能从中抓出什么猫腻来?{:5_97:} 神秘见彩蛋。
彩蛋:
**** Hidden Message ***** 可以的我想看看彩蛋 zg5174 发表于 2017-1-17 18:52
可以的我想看看彩蛋
这是一颗神奇的蛋蛋{:10_334:} 怎么有点像鬼片啊{:10_245:} 本帖最后由 零度非安全 于 2017-1-17 23:05 编辑
alltolove 发表于 2017-1-17 22:27
怎么有点像鬼片啊
看来你恐怖片看多了{:10_319:} 23333 n9vakin 发表于 2017-1-18 17:51
23333
这位为何如此开心呀?{:10_277:} 3405691582 ??
想看 0xCAFEBABE的彩蛋是什么?
页:
[1]