谷歌的 protobuf 从 golang 到 Protocol 消息包含无效标签(零)



当我使用 protobuf 将字节包从 c# 发送到 Golang 时,我没有问题。但是当我从 Golang 向 c# 发送一个字节时,会出现错误。

我在 c# 中使用此代码来获取 golang 发送的 protobuf:

 Stream stream = new MemoryStream(m);
        PRSData data;
        data = PRSData.Parser.ParseFrom(stream);
        print(data);

然后我在 c# 中收到此错误:

无效协议缓冲区异常:协议消息包含无效 标记(零)。Google.Protobuf.CodedInputStream.ReadTag ()

此外,c# 生成的 protobuf 结构是正确的,但 golang 的结构不正确

由 c# 生成的 protobuf 结构为:

{ "action": "move", "id": "player_361", "room": "SyONuNo0W", "pos": { "x": 74.423, "y": -0.04, "z": 10.903 } }

戈朗生成的原型结构为:

action:"move" id:"player_361" room:"SyONuNo0W" pos:<x:74.423 y:-0.04 z:10.903 >

请帮助我在 c# 和 Golang 中使用 protobuf 并在它们之间进行真正的转换。

从套接字读取缓冲区时,需要确保正确跟踪数据量。在您的示例(注释)中,这是size,您必须确保任何处理都限制为那么多字节。由于您使用的是 MemoryStream ,您会注意到有一个构造函数接受缓冲区和偏移量(零)和计数(size)。

请注意,如果您在单个套接字上处理多条消息,则还需要处理"成帧" - TCP不保证以发送数据的相同块接收数据 - 只是以相同的顺序接收相同的字节。

相关内容

最新更新