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

C#接收C++命名管道protobuf数据反序列化报invalid tag(zero)错误

问题根因与解决方案

1. 核心错误:C++端序列化目标地址计算错误

你C++代码中以下行存在指针运算逻辑错误:

outputMessage.SerializeToArray(&buffer + 4, messageBytes);

buffer是栈上数组的名称,本身就代表数组首元素的地址;而&buffer的类型是char (*)[messageBytes + 4],即指向整个数组的指针,对该指针做+4操作时,会偏移4 * sizeof(整个数组)的字节数,直接越出当前缓冲区的范围,并没有把序列化后的protobuf数据写到buffer数组偏移4字节的正确位置。你日志中打印的7字节消息内容本身就是无效的protobuf数据,因此反序列化时会抛出invalid tag(zero)错误。

修复方案

将该行修改为以下任意一种正确写法即可:

// 写法1:直接对数组首地址偏移4字节
outputMessage.SerializeToArray(buffer + 4, messageBytes);
// 写法2:取数组第4个元素的地址
outputMessage.SerializeToArray(&buffer[4], messageBytes);

2. 其他需要校验的潜在问题

  • 确认C++和C#两端使用的.proto定义完全一致:包括OutputMessage、Vector2的字段编号、字段类型、包名/命名空间配置,若字段编号不匹配也会触发解析错误。
  • 字节序兼容性:你当前场景下读取到的长度值正确,说明当前运行环境下字节序是匹配的;如果后续需要跨不同端序的设备传输,建议统一将长度字段转为网络字节序(大端)后再发送,接收端再转换为本地字节序解析,避免适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:06