我正在做一个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;
答案 0 :(得分:1)
根据atoi()
的文档,如果无法执行有效的转换,它将返回零“。所以,你看到的零是atoi()
告诉你,在你给它的缓冲区中,没有什么可以解释为数字。
这是因为缓冲区使用memcpy()
填充了&u16
,其大小为2
。 u16
为65000,因此假设采用小端架构,缓冲区[2]为E8
,缓冲区[3]为FD
。这不是atoi()
可以解析的数字。
为了阅读buffer[2]
处的值,您需要执行memcpy()
的反向,这是另一个memcpy()
,如下所示:
uint16_t u16;
memcpy(&u16, buffer+2, 2);
cout << u16 << endl;