Magic number,即幻數,它可以用來標記檔案或者協定的格式,很多檔案都有幻數標誌來表明該檔案的格式。
例如Windows作業系統可執行程式的開頭標記壹般為MZ,這是壹種源於磁碟作業系統時代的格式。
基本介紹 中文名 :幻數 外文名 :magic number 其它稱呼 :魔數、(魔術數字) 計算機中的含義,程式開發中的含義, 計算機中的含義 rar壓縮檔檔案的開頭有[Rar]三個字元,zip文檔開頭為[ PK ] (包、外語全稱: P ac K ) 可以用記事本(或者Ultra Edit)直接打開以上檔案類型的檔案,查看開頭的幻數。 套用 壹般而言,硬碟數據恢復軟體(如 EasyRecovery),就是靠分析磁碟上的原始數據,然後根據檔案幻數來試圖匹配檔案格式,從而嘗試識別出磁碟中那些已經從檔案系統登記表中刪除的檔案(真實的檔案內容可能沒有被覆蓋)。但是這種方法不是100%精確,因為磁碟中數據的隨機性也很大,很多沒有意義的字元串,可能被誤認為是有效的幻數,從而造成恢復出無效/錯誤的檔案。 (可以在EasyRecovery中自己定義檔案的幻數然後讓它幫妳回復,不過常用的檔案格式它都有記錄) 通常在套用開發中,檔案讀寫也可能使用檔案的幻數。例如讀取檔案時,用它來判斷檔案的格式是否匹配.如果不匹配則報告錯誤不處理檔案,或者嘗試讀取檔案的幻數標記來識別。 常見的例子。例如,把壹個bmp圖像檔案的擴展名改名為png,可能有些圖像瀏覽/編輯軟體提示:類型錯誤,載入失敗,但是有的軟體卻可以識別並讀出,並提示格式跟擴展名不匹配。 程式開發中的含義 在原始碼編寫中,有這麽壹種情況:編碼者在寫原始碼的時候,使用了壹個數字,比如0x2123,0.021f等,他當時是明白這個數字的意思的,但是別的程式設計師看他的代碼,可能很難理解,甚至,過了壹段時間,代碼的作者自己再看代碼的時候也忘記了這個數字代表的含義。於是感嘆, 雖然不知道這個數字是幹什麽用的,究竟代表什麽,但是編譯後的程式可以正常運行,真是 “ 魔術般的數字 ” 幻數即源於此。 幻數的這個含義跟上壹個不同,這個通常含貶義。因為在編程中使用幻數是不好的習慣,開發中應當盡量避免。 幻數的兩大弊端: 壹、代碼可讀性差,例如 float?time=1.0f;小數類型時間=1.0ffloat?speed=time*2.13f;小數類型速度=時間*2.13f 如果沒有說明,很難猜到那個2.13f的含義,假如它代表加速度,那麽修改如下: #define?ACCELERATION?(2.13f);/*#定義加速(2.13f)前等於後*/float?speed=time*ACCELERATION;小數類型速度=時間*加速 這樣對於代碼閱讀者來說更好理解。 二、修改不方便,例如 setfontcolor(string,0xFFFFFFFF);/*設定字型顏色(字元串,0xffffffff);設此函式設定壹個字元串的顏色**等等……*/setbackcolor(widget,0xFFFFFFFF);/*設定背景色(小部件,0xffffffff);設此函式設定控制項背景色**等等……*/ 暫且不說0xFFFFFFFF代表的含義,如果程式中很多地方使用了統壹的壹個常量,如果要修改值的時候很麻煩,也容易出錯。可能有遺漏等等諸多問題。 同樣可以改為如下: static?const?int?WHITE=0xFFFFFFFF;/*靜態常量整數類型WHITE=0xFFFFFFFF;WHITE是白色*/setfontcolor(string,WHITE);/*設定字型顏色(字元串、WHITE);**等等……*/setbackcolor(widget,WHITE);設定背景色(小部件、WHITE);/*等等……*/ 這樣程式代碼不僅便於閱讀,而且要替換他的值,只需要替換壹次就好了。 解決魔術數字的方法主要是將這些數字定義為常量,或者枚舉類型,或者使用編譯器的宏定義(如C/C++的#define) 魔術數字在程式開發中還有壹個用途(這個時候它是中性詞),就是作為 調試符號 ,便於觀察和調試程式中出現的錯誤。 舉壹個常見例子,windows下的程式設計師在調試程式時候,如果報錯,可能對如下數字(地址)比較熟悉:0xcdcd,0x等。 0xcdcd 是微軟的C++ Debug 運行庫 為沒有初始化的堆記憶體所做的標記,例如malloc分配出的記憶體,其內容可能全部都是0xcdcd。由於0xcdcd的編碼,解釋為中文的話為 “ 屯 ” ,所以windows下的程式設計師,windows用戶應該對 “ 屯屯屯屯屯屯 ” 這樣的字元串並不陌生。 0x同樣是微軟的運行庫為未初始化的棧空間所做的調試標記。 類似的還有 0x FDFDFD, 0x FEEEFEEE, 0x DEADDEAD, 0x ABABABAB 這些都是微軟用到的幻數,在win32下程式調試的可以參考,但是不能在程式開發的代碼中使用,原因很簡單,這個跟平臺,運行庫和編譯模式有很大關系,只是為了調試所設定的標記,僅此而已。 其它平臺也有很多幻數,例如著名的0xDEADBEEF (dead beef) 如果自己需要編寫記憶體管理模組,使用自己的幻數也可以很方便的做為調試所用。