c++ - 为什么我的 Char* 在填充整数后为空?
问题描述
我想在一个 char 指针中保存几个整数,然后用 sendto (winsock2) 发送这个指针。不幸的是,我的 char 指针总是只包含“\n”。就在创建时和填充后。我做错了什么?
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
解决方案
您的 char 指针不包含'\n'
,至少不在第一个位置。相反,它包含NUL
作为第一个元素,因此当显示为 C 样式字符串时它将显示为空白。
& 0xff
这是因为用 获得的最低有效 8 位 10
右移 24 次为零。
char
缓冲区中有数据。特别注意inputBuffer[3]
它的值是 10。只是你不能用你最喜欢的字符串查看器看到它!
最后,考虑使用unsigned char
而不是char
,因为 的签名char
是平台相关的。( C++14 之前的char
if的补充方案也是如此)。signed
推荐阅读
- node.js - Firebase Cloud Function Unhandled error RangeError:超过最大调用堆栈大小
- java - Intelij 用新名称创建新包
- amazon-web-services - 从 Google Scripts 到 AWS Lambda 的 POST 请求以 null 的形式通过
- azure-active-directory - 开发和测试 Live Active Directory B2C 租户的更新
- django - Celery beat 卡在“写条目……”。芹菜工人工作正常
- rust - 如何为外部类型实现 serde 的反序列化和序列化?
- html - 为什么我的部分元素没有显示为正文的一部分?
- mongodb - Mongodb:$四舍五入十进制
- typescript - 'IntrinsicAttributes & Props & { children?: ReactNode; 类型上不存在属性 'customerCode' }'
- mongodb - 在查找查询中引用自己的项目字段