我有一個整數val。字節數組到一個短
data[0]=0;
data[1]=0;
data[2]=(val>>8)%256;
data[3]=val%256;
我該怎麼做oposite?如何從char數組中取int?
我有一個整數val。字節數組到一個短
data[0]=0;
data[1]=0;
data[2]=(val>>8)%256;
data[3]=val%256;
我該怎麼做oposite?如何從char數組中取int?
對於無符號數:
val = (data[2] << 8) | data[3];
對於簽名的數據:
val = ((data[2] << 8) & 0xff00) | (data[3] & 0xff);
簡單的方法:
int myint = mybyte[0]<<24+mybyte[1]<<16+mybyte[2]<<8+mybyte[3];
假設'你的位順序,他們都沒有簽名。您可能必須將這些字節轉換爲整數才能確保它們不包裝(11001100 - > 11001100,0000000而不是11001100)。
一個令人稱奇的方式(儘管可能更快)將是某種可疑的法律與指針:
int * myintp= mybyte;
int myint = *myintp;
我沒有測試這個可言,但它應該從理論上工作,假設長度奏效,等等。這可能不是一個好主意。
您的指針投射在小端機器上效果不佳。 – advait 2010-08-05 21:27:47
我如何將字節轉換爲ints以確保它們不包裝? – cateof 2010-08-05 21:31:08
@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
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));
你總是可以嘗試一個聯盟:
typedef union {
int i;
uint8_t bytes[sizeof(int)];
} int_u;
您可以使用它將int
轉換爲字節,反之亦然。但是,如果您正在使用它在平臺之間傳輸數據,請注意端到端問題。
如果要逐字節地存儲數據而不是字符,請使用'stdint.h'中定義的uint8_t。 – KillianDS 2010-08-05 21:39:56
而不是使用模運算符,你可以簡單地用'val&0xFF'來掩蓋這些位。這使您的意圖更清晰,並且(在大多數CPU架構上)效率更高。 – bta 2010-08-05 21:40:08
@bla,我懷疑它在任何現代流水線架構上都會更快,但它確實更清晰。此外,我認爲你實際上可以跳過任何掩碼和模數演算,高位被隱式轉換拋出。 – KillianDS 2010-08-05 21:43:18