2013-07-18 38 views
1

我有以下代碼從文件中獲取像素值。我正在運行OS X的英特爾MacBook上。我相信這是小端。我有以下代碼,我正在使用它來確定是否在像素上設置了最低有效位。它編譯並運行,但我不確定操作是否真的能給我正確的數據。在小端機器上,位運算符將如何工作?

typedef struct { 
    unsigned char blue; 
    unsigned char green; 
    unsigned char red; 
} pixel_t; 

pixel_t *pixels = malloc(((bmp->dib.bmp_bytesz/3)+1) * sizeof(*pixels)); 

printf("%u", (pixels[i].red & 0x01)); 
printf("%u", (pixels[i].green & 0x01)); 
printf("%u", (pixels[i].blue & 0x01)); 
+0

在問一個關於endian-ness的問題之前,你應該知道它是什麼。它與您的代碼無關。 –

回答

7

小端和大端指字節的更大的單元的順序(未比特本身)(像shortint)。

按位運算是相同的;操作是給你pixels[i].blue等數字的最低有效位。如果他們存儲在char(或unsigned charsigned char),則沒有問題。如果將它們存儲在intshort或其他內容中,則所尋址的字節將根據機器是大端還是小端而不同,但它仍然是平臺上數字的最低位。

+0

雖然我有一個問題。如果你在一個Little endian機器上寫了一個struct {}到一個文件,然後將這個文件讀回到Big endian機器上的一個結構體中,誰將負責解決endian差異? – lsk

+2

程序員。你可以定義哪個程序員。有些系統使用'發送者正確';一些系統使用'接收器正確';一些系統有其他規則。對於網絡控制數據(IP地址等),數據以機器中立的順序傳輸(這恰好是大端IIRC),那些不使用機器中立命令的機器必須解決這些問題。 –

+0

感謝您的澄清。 – lsk

5

Endianess是一個內部細節,影響如何存儲。它對的計算方式沒有影響。

2

喬納森已經有了正確的答案......只是增加一個例子。

Endianness描述了多字節數據如何存儲在計算機內存中。它描述了內存中地址的最高有效字節(MSB)和最低有效字節(LSB)的位置。 Big Endian:首先存儲MSB,即從左到右 Little Endian:首先存儲LSB,即從右到左。

例如:0x04030201如何存儲在內存中?

Address  BE LE 
00000000 04 01 
00000001 03 02 
00000002 02 03 
00000003 01 04 
相關問題