2012-10-07 39 views
1

我有下面的代碼,但我不能把intbuffer認沽INT到現有緩衝區

unsigned char buffer[1024]; 
buffer[0] = 0x44; 
u_long fd = htonl(VERSION); 
memcpy(buffer+1, &fd, 4); 

你能幫我嗎?

+0

改變的問題是壞習慣......如果有必要的話,可以提出另一個問題。它會使其他人的答案無用。 – perilbrain

回答

0

buffer[1]ntohl(buffer[1]);值將採取(炭)和將被鑄造成long。這將導致一個小端機器採取在&buffer[1]值上這顯然是0值小於2 (無符號),因爲您之前調用了ntohl,這反轉了字節順序。

如果你真的有興趣尋找到緩衝區,然後嘗試

int *f =(int*) (&buffer[1]); 
printf("\n %u \n", ntohl(*f));//Also *f but then you have to paste it in calculator to see allignment 
+0

謝謝!一切都好,但我有一個問題。當試圖在我的C#服務器應用程序中讀取這個'int'時,我有一個'數字溢出'錯誤。你知道這件事嗎? – Roman

+0

看看你是否搞亂了字節轉換。 – perilbrain

0

你把值到緩衝區正確的,但你不檢查它正確之後。 ntohl(buffer[1])通過本身檢索出的1字節unsigned char值,是緩衝的第二時隙內,然後將其傳遞給ntohl()當它延伸到一個4字節的值。你需要做的,而不是什麼是取回4字節unsigned long值佔據第二,第三,第四,和緩衝的第五位,並用它作爲-是:

ntohl(*reinterpret_cast<u_long*>(buffer+1)); 

或者:

u_long version; 
memcpy(&version, buffer+1, 4); 
ntohl(version);