2009-03-02 59 views
1

我有一些現有的代碼用於將圖像寫入位圖文件。其中一行代碼如下所示:多字節字符常量和位圖文件標題類型常量

bfh.bfType='MB'; 

我想我可能是從某處複製的。其他開發者之一對我說:「這看起來不正確,是不是應該是'BM'?」反正它似乎好的工作,但在代碼審查它被重構到這一點:

bfh.bfType=*(WORD*)"BM"; 

谷歌搜索顯示,大部分的時間,第一線似乎被使用,而有些時候人們會這樣做:

bfh.bfType=0x4D42; 

那麼有什麼區別?他們如何能夠給出正確的結果?無論如何,多字節字符常量意味着什麼?他們真的一樣嗎?

回答

4

所有三個(可能)是等價的,但出於不同的原因。

bfh.bfType=0x4D42; 

這是最簡單的理解,它只是用來加載bfType與多家恰好代表8-15位ASCII「M」和ASCII 0-7位「B」。如果你以little-endian格式將其寫入流中,那麼流將包含'B','M'。

bfh.bfType='MB'; 

這基本上等同於第一條語句 - 它只是一種表達整型常量的不同方式。它可能取決於編譯器究竟是怎麼處理它的,但它可能會根據你編譯的機器的字節順序產生一個值。如果你在一臺具有相同字節序的機器上編譯和執行,那麼當你在流上寫出值時,你應該得到'B','M'。

bfh.bfType=*(WORD*)"BM"; 

在這裏,「BM」使編譯器創建一個數據塊,看起來像「B」,「M」,「\ 0」,並得到一個char *指向它。然後這被轉換成WORD *,這樣當它被解除引用時,它將把該內存讀作WORD。因此它讀取'B','M'到機器所具有的任何字節順序中的bfType。使用相同的字節順序寫出來顯然會在您的流上放置'B','M'。只要你使用bfType寫出流,這是最便攜的版本。但是,如果您正在使用bfType進行任何比較/比較,那麼最好爲其選擇一個字節序列並在讀取或寫入該值時根據需要進行轉換。

1

我沒有找到API,但根據http://cboard.cprogramming.com/showthread.php?t=24453,bfType是一個bitmapheader。 BM的值很可能意味着「位圖」。

0x4D42是一個十六進制值(M爲0x4D,B爲0x42)。在little endian寫作方式(最低有效字節第一),這將是相同的「BM」(而不是「MB」)。如果它也適用於「MB」,那麼可能會採用一些默認值。

0

補遺tehvan的帖子:

維基百科條目上BMP

File header 注意,BMP格式的文件(因此BMP頭)的前兩個字節存儲在大 - 印第安單。這是神奇的數字'BM'。所有其他整數值都以little-endian格式存儲(即最低有效字節在前)。

所以它看起來像重構代碼是正確的,根據規範。

你有沒有試過用'MB'作爲魔術數字與幾個不同的照片編輯器打開文件?