用c ++解包数据包

时间:2017-06-03 20:39:37

标签: c++ printing

我正在做一个udp客户端服务器模型的事情,我的问题基本上归结为无法在这个简短的程序中打印数字65000。我得到的输出是:0

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; 

1 个答案:

答案 0 :(得分: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;