2011-08-25 51 views
0

有人可以幫助我理解此代碼正在發生什麼。它看起來像是從一個數組中創建一個整數。我不知道它是如何做到這一點。爲什麼在OxFF上有一個按位操作&? Inst這會產生相同的結果?C位操作問題

//first take the first 4 bytes read out of the socket into an array and 
//make them a 32 bit integer 

     long ltemp =0; 
     long ltemp2 = 0; 
     ltemp = ltemp | (unsigned char)(analog_val_ptr[0] & 0xff); 
     ltemp = ltemp << 24; 
     ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[1] & 0xff); 
     ltemp2 = ltemp2 << 16; 
     ltemp = ltemp2 | ltemp; 
     ltemp2 =0; 
     ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[2] & 0xff); 
     ltemp2 = ltemp2 << 8; 
     ltemp = ltemp2 | ltemp; 
     ltemp = ltemp | (unsigned char)(analog_val_ptr[3] & 0xff); 

///then convert that integer into a float, passing 
+0

analog_val_ptr的類型是什麼?它看起來像程序員試圖通過使用'&0xFF'並轉換爲'unsigned char'來加倍確定。我想它們都可以自己做。 – john

+0

它的一個字節,數據從套接字進入 – user489041

回答

3

這只是將4個8位字節到一個32位長非常囉嗦的方式。

and0xff只是確保只使用每個值的低8位(0xff == binary 11111111)。

位移(8的倍數)就是讓每個字符進入正確的位置。

unsigned long ltemp = (unsigned char)(analog_val_ptr[0] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[1] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[2] & 0xff); 
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[3] & 0xff); 

,或者(假設他們有),使用正確的工具來做,特別是htonl()ntohl()

整個事情可能喜歡的東西來代替。

+0

'&0xff'並轉換爲'unsigned char'完全是多餘的。一個或另一個應該被刪除,可能是演員。 –

+0

作爲一個風格問題,結果可能是一個'unsigned long',只是爲了明確結果。 –

+0

@Kerrek,好點,修改來修復。 – paxdiablo

1

它看起來像從字節的數組構建整數。這可能是analog_val_ptr[]是一個intshort值的數組,此代碼旨在將每個條目視爲一個字節。屏蔽是爲了防止符號位溢出目標變量。

0
var = 0x ? ? ? ? ? ? ? ? 
     & & & & & & & & 
     0x 0 0 0 0 0 0 f f 
     ------------------ 
     0 0 0 0 0 0 ? ? 

AND操作的低8位之後將與var & 0xff被發現。它的一種方法是隻剪掉所需的部分,掩蓋。

上面的代碼只是將4個數組元素的低位字節作爲long int粘貼到變量ltemp中。

+0

'&'是AND,而不是XOR – Hasturkun

+0

我已經瘋了。對不起,糾正.. – phoxis

1

看起來像是要進行endian獨立轉換。