我有下面的代碼,但我不能把int
我buffer
。認沽INT到現有緩衝區
unsigned char buffer[1024];
buffer[0] = 0x44;
u_long fd = htonl(VERSION);
memcpy(buffer+1, &fd, 4);
你能幫我嗎?
我有下面的代碼,但我不能把int
我buffer
。認沽INT到現有緩衝區
unsigned char buffer[1024];
buffer[0] = 0x44;
u_long fd = htonl(VERSION);
memcpy(buffer+1, &fd, 4);
你能幫我嗎?
在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
謝謝!一切都好,但我有一個問題。當試圖在我的C#服務器應用程序中讀取這個'int'時,我有一個'數字溢出'錯誤。你知道這件事嗎? – Roman
看看你是否搞亂了字節轉換。 – perilbrain
你把值到緩衝區正確的,但你不檢查它正確之後。 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);
改變的問題是壞習慣......如果有必要的話,可以提出另一個問題。它會使其他人的答案無用。 – perilbrain