2011-04-26 111 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開頭)是相當常見的做法。這減少了意外嘗試將錯誤類型的文件解釋爲類文件的可能性。