2010-08-05 47 views
1

我有一個整數val。字節數組到一個短

data[0]=0; 
data[1]=0; 
data[2]=(val>>8)%256; 
data[3]=val%256; 

我該怎麼做oposite?如何從char數組中取int?

+0

如果要逐字節地存儲數據而不是字符,請使用'stdint.h'中定義的uint8_t。 – KillianDS 2010-08-05 21:39:56

+0

而不是使用模運算符,你可以簡單地用'val&0xFF'來掩蓋這些位。這使您的意圖更清晰,並且(在大多數CPU架構上)效率更高。 – bta 2010-08-05 21:40:08

+1

@bla,我懷疑它在任何現代流水線架構上都會更快,但它確實更清晰。此外,我認爲你實際上可以跳過任何掩碼和模數演算,高位被隱式轉換拋出。 – KillianDS 2010-08-05 21:43:18

回答

4

對於無符號數:

val = (data[2] << 8) | data[3]; 

對於簽名的數據:

val = ((data[2] << 8) & 0xff00) | (data[3] & 0xff); 
+0

這看起來像正確的答案,但它不起作用 – cateof 2010-08-05 21:30:27

+0

你能給我們提供'data'和'val'的確切數據類型嗎?您可能會受到符號擴展的困擾。 – 2010-08-05 21:33:03

+1

是的;這也是我的猜測。如果'data'是'signed char *',且'data [2]'或'data [3]'中的任何一個大於127,則結果的高位可以用1填充。 – strager 2010-08-05 21:35:59

-3

通過簡單的元素進行迭代,並做了Int.Parse

+0

'Int.Parse'不是標準C,也不是在這裏解決問題。 – bta 2010-08-05 21:36:56

0

簡單的方法:

int myint = mybyte[0]<<24+mybyte[1]<<16+mybyte[2]<<8+mybyte[3]; 

假設'你的位順序,他們都沒有簽名。您可能必須將這些字節轉換爲整數才能確保它們不包裝(11001100 - > 11001100,0000000而不是11001100)。

一個令人稱奇的方式(儘管可能更快)將是某種可疑的法律與指針:

int * myintp= mybyte; 
int myint = *myintp; 

我沒有測試這個可言,但它應該從理論上工作,假設長度奏效,等等。這可能不是一個好主意。

+1

您的指針投射在小端機器上效果不佳。 – advait 2010-08-05 21:27:47

+0

我如何將字節轉換爲ints以確保它們不包裝? – cateof 2010-08-05 21:31:08

+0

@advait:這就是爲什麼我說這是一個糟糕的選擇:P @cateof:((int)mybyte [0])<< 24 +((int)mybyte [1])<< 16 + ... (((int)mybyte [0])&0xFF)<< 24 +(((int)mybyte [1])&0xFF)<< 16 + ... 但是這可能是非常可靠的不需要,所以先嚐試一下沒有AND。 – zebediah49 2010-08-05 21:38:48

0

mod是一個非常昂貴的操作,特別是對於保存32位int。你可能只是想memcpy。如果你擔心便攜扔在一個htonl:

#include<string.h> 

uint32_t x = 12; 
char data[4]; 
memcpy(data, &x, sizeof(x)); 

要轉到你可以扭轉它的其他方式:

memcpy(&x, data, sizeof(x)); 
0

你總是可以嘗試一個聯盟:

typedef union { 
    int  i; 
    uint8_t bytes[sizeof(int)]; 
} int_u; 

您可以使用它將int轉換爲字節,反之亦然。但是,如果您正在使用它在平臺之間傳輸數據,請注意端到端問題。