You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ UDP发送含0x00字符数组问题求助

解决UDP发送含0x00的字节数组被截断的问题

你的问题根源在于用std::string存储二进制数据——std::string是为文本设计的,它会把0x00(即'\0')当作字符串的结束符,所以length()只会计算到第一个0x00之前的长度,c_str()返回的指针也会在第一个0x00处终止,导致发送时只发了第一个字节0x11。

正确的做法:用二进制容器存储数据

不要用字符串类型存储二进制数据,改用uint8_t数组或者std::vector<uint8_t>,这两种容器都能正确处理包含0x00的有效数据。

方案1:使用uint8_t数组

// 直接定义完整的字节数组
uint8_t request_soladin_meter_data_command[] = {0x11, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc7};
// 获取数组的实际长度
size_t data_length = sizeof(request_soladin_meter_data_command);

// 保持原有的socket创建、地址配置代码不变...

// 发送时传入数组指针和实际长度
send(udpsocket, request_soladin_meter_data_command, data_length, 0);

方案2:使用std::vector<uint8_t>

如果需要动态调整数据内容,用std::vector<uint8_t>更灵活:

#include <vector>

// 初始化二进制数据
std::vector<uint8_t> request_soladin_meter_data_command = {0x11, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc7};

// 保持原有的socket创建、地址配置代码不变...

// 发送时用data()获取底层数组指针,size()获取实际长度
send(udpsocket, request_soladin_meter_data_command.data(), request_soladin_meter_data_command.size(), 0);

额外说明

UDP是无连接协议,你代码里的connect()调用只是绑定了默认的目标地址,不影响发送功能,但如果不需要固定目标地址,也可以改用sendto()函数直接指定目标地址和端口。

内容的提问来源于stack exchange,提问作者Borgie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:01:35