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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:53:26