在C 中解开包装数据包

Unpacking data packets in c++

本文关键字:包装 数据包      更新时间:2023-10-16

我正在做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; 

根据atoi()的文档,如果无法执行有效的转换,它将返回零"。因此,您看到的零是atoi()告诉您,在缓冲区中您给它的零是什么可以解释为数字的。

那是因为使用&u16的CC_5填充了缓冲区的memcpy()u16是65000,因此,假设一个小的架构,缓冲区[2]为 E8,而缓冲区[3]为 FD。这不是atoi()可以解析的数字。

为了读取buffer[2]的值,您需要进行memcpy()的反面,这是另一个memcpy(),如下:

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