2017-06-03 51 views
-1

我正在做一個udp客戶端服務器模型的事情,我的問題基本上歸結爲不能在這個簡短的程序中打印數字65000。我得到的輸出是:0在C++中解包數據包

struct pHeader{ 
    uint16_t from = -1; 
} pHead; 

void formatPacket(pHeader header, char buffer[]) { 
    uint16_t u16; 
    u16 = header.from; 
    memcpy(buffer+2, &u16, 2); 
} 

int main() { 
cout << "buffer" << endl; 

char buffer[10]; 

pHead.from = 65000; 
formatPacket(pHead, buffer); 

cout << atoi(buffer+2) << endl; 
} 

我想要做的下一件事是打印過的值在說的也是16位的數組的第一個元素。我相信是這樣的做:

. 
. 
. 
buffer[2] = 0; 
cout << atoi(buffer+0) << endl; 
+0

你認爲是什麼讓那個的memcpy的'反向()'是' atoi()'? –

+0

爲什麼你使用C++標籤?這是C與Cout。 – 2017-06-04 07:47:39

回答

1

atoi()文件,它將返回零「如果能夠執行任何有效的轉換」。所以,你看到的零點是atoi()告訴你,在你給它的緩衝區中,它沒有什麼可以解釋爲一個數字。

這是因爲緩衝區填充了memcpy()使用&u16大小爲2u16是65000,所以假設小端架構,緩衝區[2]是E8,並且緩衝區[3]是FD。這不是一個atoi()可以解析的數字。

爲了在buffer[2]讀取值,你需要做的memcpy()相反,這是另一種memcpy(),具體如下:

uint16_t u16; 
memcpy(&u16, buffer+2, 2); 
cout << u16 << endl; 
+0

ohhhhhhh。 1.5小時,我浪費了我' – djent

+0

好,實際上,這種浪費時間往往會發生很多,有時甚至是有經驗的程序員,所以不要氣餒。但是嘗試學習使用調試器,它在這種情況下非常有用。 –