为什么我的 Char* 在填充整数后为空?



我想在字符指针中保存几个整数,然后使用 sendto (winsock2( 发送此指针。不幸的是,我的字符指针总是只包含""。在创建时和填充后也是如此。我做错了什么?

uint32_t id = getID();
uint8_t inputType = getInputType(), inputValue = getInputValue();
char* inputBuffer = new char[6];
inputBuffer[0] = (id >> 24) & 0x000000ff;
inputBuffer[1] = (id >> 16) & 0x000000ff;
inputBuffer[2] = (id >> 8) & 0x000000ff;
inputBuffer[3] = (id >> 0) & 0x000000ff;
inputBuffer[4] = (inputType >> 0) & 0x000000ff;
inputBuffer[5] = (inputValue >> 0) & 0x000000ff;
// Send to Server
sendto(socket, inputBuffer, 6, 0, (SOCKADDR*)&srvAddr_In, sizeof(SOCKADDR));
delete[] inputBuffer;

id、inputType 和 inputValue 始终包含一个有效的数字。 例如,我尝试id = 10,inputType = 4和inputValue = 6

你的字符指针不包含'n',至少无论如何都不在第一个位置。相反,它包含NUL作为第一个元素,因此当显示为 C 样式字符串时,它将显示为空白。

这是因为用& 0xff获得的最不重要的 8 位,10右移 24 次为零。

char缓冲区中有数据。特别请注意,inputBuffer[3]的值为 10。只是你无法用你最喜欢的字符串查看器看到它!

最后,考虑使用unsigned char而不是char,因为char的符号性取决于平台。(如果signed在C++14之前,则char的补充方案也是如此。

让我们一步一步地来看看出了什么问题:

uint32_t id = 100

id 的位表示形式为:

00000000 00000000 00000000 01100100

第 1 步。

声明:inputBuffer[0] = (id >> 24) & 0x000000ff;
从字面上讲,您可以将其简化为:(id >> 24)

结果:inputBuffer[0] = 00000000

第 2 步。

声明:inputBuffer[0] = (id >> 16) & 0x000000ff;

结果:inputBuffer[1] = 00000000

第 3 步。

声明:inputBuffer[0] = (id >> 8) & 0x000000ff;

结果:inputBuffer[2] = 00000000

第 4 步。

声明:inputBuffer[0] = (id >> 0) & 0x000000ff;

结果:inputBuffer[3] = 01100100//100

如果您尝试在此阶段打印inputBuffer,它将不会打印任何内容,因为第一个位置包含。这完全没问题。您只需要在消息的接收端小心。

接收结束:

uint32_t id = (uint32_t)data[0] << 24)  |
((uint32_t)data[1] << 16) |
((uint32_t)data[2] << 8)  |
((uint32_t)data[3]);
//id == 100

最新更新