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
相关产品推荐
相关产品推荐

