当我使用protobuf从c#向Golang发送一个字节数据包时,我没有问题。但是当我从Golang发送一个字节到c#get error。
我在c#中使用此代码来获取golang发送的protobuf:
Stream stream = new MemoryStream(m);
PRSData data;
data = PRSData.Parser.ParseFrom(stream);
print(data);
然后我在c#中出现了这个错误:
InvalidProtocolBufferException:协议消息包含无效 标签(零)。 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 } }
golang生成的protobuf结构是:
action:"move" id:"player_361" room:"SyONuNo0W" pos:<x:74.423 y:-0.04 z:10.903 >
请帮助我在c#和Golang中使用protobuf并真正实现它们之间的转换。
答案 0 :(得分:0)
从套接字读取到缓冲区时,您需要确保正确跟踪您拥有的数据。在您的示例(注释)中,这是size
,您必须确保任何处理都限制在那么多字节。由于您使用的是MemoryStream
,因此您会注意到有一个构造函数接受缓冲区以及偏移量(零)和计数(size
)。
请注意,如果您在单个套接字上处理多个消息,则还需要处理&#34; framing&#34; - TCP不保证在发送数据的相同块中接收数据 - 只是相同顺序的相同字节。