我想在字符指针中保存几个整数,然后使用 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
,它将不会打印任何内容,因为第一个位置包含