2011-12-08 60 views
1

背景轉換INT 14236十六進制379C爲char [37,9C]在C++

我創建一個簡單BOOTP/DHCP服務器,並且我與創建的一些包中的字節掙扎 - 特別是DHCP選項13,FileSize。

該規範狀態選項爲具有64個字節用於ID(13)=> 1個字節,對於數據長度1個字節,總長度和剩餘的字節數據或0

問題

我需要將int值14236表示爲我的數據,這相當於HEX中的379C,但這需要分散在2個字節的數據中。如何獲取int並獲取數據的char []?

+0

Int爲char? itoa()http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ – nacho4d

回答

1
int size = 14236; 
unsigned char bytes[2] = { (size >> 8) & 0xff, size & 0xff }; 

printf("%x%x", bytes[0], bytes[1]); 

注意:您需要確保兩個字節被放置在網絡的順序排列,這要是我的。我們把爲大端。

+0

第一個答案,它的工作原理。多謝你們!現在來打磨我生鏽的C++技能。 – justacodemonkey

3

您可以使用此代碼:

int size; 
assert(size < 0x10000); 

unsigned char twoBytes[]; 
twoBytes[0] = size & 0xFF; 
twoBytes[1] = size >> 8; 
4

它可能需要在網絡字節順序。如果是這樣,那麼你可以使用htons。如果你想它的兩個字節:

char buffer[4]; 
buffer[0] = 13; // code 
buffer[1] = 2; // length 
*(uint16_t*)(buffer + 2) = htons(14236); 
+0

這個問題非常好。謝謝馬克 – justacodemonkey

0

所以,你的包:

unsigned char optionBytes[64]; 

然後,設置ID和數據長度:

optionBytes[0] = 13; 
optionBytes[1] = 2; 

最後,請計算您的值的高位字節和低位字節:

optionBytes[2] = 14236/256; 
optionBytes[3] = 14236 % 256; 

這假定您希望以「big-endian」格式表示數據,而較低的偏移值更值得。