C++中如何向字符串添加ASCII码0x00?TCP/IP命令发送问题
问题根源
你用+=操作符把short转换后的char*追加到std::string时,触发了std::string针对C风格字符串的重载逻辑——它会把'\0'(也就是0x00字节)当作字符串结束标志,所以当转换后的2字节数据里包含'\0'时,只会追加到第一个'\0'为止,直接丢弃了后续的字节(甚至第一个'\0'本身也没被正确追加)。
解决办法
把+=替换成std::string::append方法,明确指定要追加的字节长度(这里是short的大小,固定2字节),这样就能强制把所有字节(包括'\0')都加入字符串:
dataPoints_str.append(reinterpret_cast<char const*>(&point_2b), sizeof(point_2b));
修改后的完整代码
std::string command(int ch, std::string parameter){ std::ifstream f_in(parameter, std::ios::in); std::string wavename; std::string point; std::string dataPoints_str; short point_2b; //2-byte signed integer f_in>>wavename; while(f_in>>point){ point_2b = htons(stoi(point, 0, 16)); //转成2字节十六进制整数并转换为大端字节序 // 使用append指定长度,避免'\0'截断数据 dataPoints_str.append(reinterpret_cast<char const*>(&point_2b), sizeof(point_2b)); } f_in.close(); return "C" + std::to_string(ch) + ":WVDT WVNM," + wavename + ",WAVEDATA," + dataPoints_str + "\n"; }
额外说明
std::string本身完全支持存储包含'\0'的二进制数据,它的实际长度由内部维护的size()值决定,不是靠'\0'判断。之前的问题纯粹是+=操作符的重载行为导致的,换用append并指定长度就能绕过这个限制,确保所有二进制字节都被正确追加。
内容的提问来源于stack exchange,提问作者Crisps
相关产品推荐
相关产品推荐

