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

