-
magic number
鎖定
Magic number,即幻數,它可以用來標記文件或者協議的格式,很多文件都有幻數標誌來表明該文件的格式。
例如Windows操作系統可執行程序的開頭標記一般為MZ,這是一種源於磁盤操作系統時代的格式。
- 中文名
- 幻數
- 外文名
- magic number
- 其它稱呼
- 魔數、(魔術數字)
- 作 用
- 在編程中起到變量的作用
magic number計算機中的含義
可以用記事本(或者Ultra Edit)直接打開以上文件類型的文件,查看開頭的幻數。
- 應用
一般而言,硬盤數據恢復軟件(如 EasyRecovery),就是靠分析磁盤上的原始數據,然後根據文件幻數來試圖匹配文件格式,從而嘗試識別出磁盤中那些已經從文件系統登記表中刪除的文件(真實的文件內容可能沒有被覆蓋)。但是這種方法不是100%精確,因為磁盤中數據的隨機性也很大,很多沒有意義的字符串,可能被誤認為是有效的幻數,從而造成恢復出無效/錯誤的文件。
(可以在EasyRecovery中自己定義文件的幻數然後讓它幫你回覆,不過常用的文件格式它都有記錄)
通常在應用開發中,文件讀寫也可能使用文件的幻數。例如讀取文件時,用它來判斷文件的格式是否匹配.如果不匹配則報告錯誤不處理文件,或者嘗試讀取文件的幻數標記來識別。
常見的例子。例如,把一個bmp圖像文件的擴展名改名為png,可能有些圖像瀏覽/編輯軟件提示:類型錯誤,加載失敗,但是有的軟件卻可以識別並讀出,並提示格式跟擴展名不匹配。
magic number程序開發中的含義
在源代碼編寫中,有這麼一種情況:編碼者在寫源代碼的時候,使用了一個數字,比如0x2123,0.021f等,他當時是明白這個數字的意思的,但是別的程序員看他的代碼,可能很難理解,甚至,過了一段時間,代碼的作者自己再看代碼的時候也忘記了這個數字代表的含義。於是感嘆,
雖然不知道這個數字是幹什麼用的,究竟代表什麼,但是編譯後的程序可以正常運行,真是“魔術般的數字”
幻數即源於此。
幻數的這個含義跟上一個不同,這個通常含貶義。因為在編程中使用幻數是不好的習慣,開發中應當儘量避免。
幻數的兩大弊端:
一、代碼可讀性差,例如
float time=1.0f;//小數類型時間=1.0f float 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); /*等等……*/
這樣程序代碼不僅便於閲讀,而且要替換他的值,只需要替換一次就好了。
魔術數字在程序開發中還有一個用途(這個時候它是中性詞),就是作為調試符號,便於觀察和調試程序中出現的錯誤。
舉一個常見例子,windows下的程序員在調試程序時候,如果報錯,可能對如下數字(地址)比較熟悉:0xcdcd,0xcccc等。
0xcdcd 是微軟的C++ Debug 運行庫 為沒有初始化的堆內存所做的標記,例如malloc分配出的內存,其內容可能全部都是0xcdcd。由於0xcdcd的編碼,解釋為中文的話為“屯”,所以windows下的程序員,windows用户應該對“屯屯屯屯屯屯”這樣的字符串並不陌生。
0xcccc同樣是微軟的運行庫為未初始化的棧空間所做的調試標記。
類似的還有 0xFDFDFD,0xFEEEFEEE,0xDEADDEAD,0xABABABAB
其它平台也有很多幻數,例如著名的0xDEADBEEF (dead beef)
如果自己需要編寫內存管理模塊,使用自己的幻數也可以很方便的做為調試所用。
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:18次歷史版本
- 最近更新: 盛开的希望之花