谷歌';s protobuf从golang到c#-协议消息包含无效标记(零)
当我使用protobuf从c#向Golang发送字节数据包时,我没有问题。但当我从Golang发送一个字节到c#get error时 我在c#中使用此代码获取golang发送的protobuf:谷歌';s protobuf从golang到c#-协议消息包含无效标记(零),c#,go,protocol-buffers,C#,Go,Protocol Buffers,当我使用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#中得到这个错误: Invali
Stream stream = new MemoryStream(m);
PRSData data;
data = PRSData.Parser.ParseFrom(stream);
print(data);
然后我在c#中得到这个错误:
InvalidProtocolBufferException:协议消息包含无效的
标记(零)。Google.Protobuf.CodedInputStream.ReadTag()
此外,c#生成的protobuf结构是正确的,但golang的protobuf结构是错误的
c#生成的protobuf结构是:
golang生成的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:
请帮助我使用c#和Golang中的protobuf并在它们之间进行真正的转换。当从套接字读取到缓冲区时,您需要确保正确跟踪您拥有的数据量。在您的示例(注释)中,这是
大小
,您必须确保任何处理都被限制为这么多字节。由于您使用的是MemoryStream
,您会注意到有一个构造函数接受缓冲区和偏移量(零)以及计数(size
)
请注意,如果您在一个套接字上处理多条消息,您还需要处理“帧”(framing)——TCP不保证在发送数据的相同数据块中接收数据——只是以相同的顺序接收相同的字节。您使用的是二进制布局吗?还是json布局?听起来像二进制文件,但底部的示例是json。数据是否被意外填充?如果它是二进制的,那么它是否可以正常工作?(您可以使用该页面验证来自文件、十六进制或base-64的二进制)-注意,我的直觉是在payloadI之后填充我从c 35;
PRSData data=。。。portobyf;字节[]buf=((Imessage)数据).ToByteArray()代码>很棒;现在,如果您使用十六进制、base-64或其文件版本并运行/decode,它将告诉您数据的格式是否错误。首先要知道它的格式是否错误。然而,在您的golang代码中,您如何获得m
并不明显,而在c代码中,您如何使用buf
也不明显,因此也完全有可能在传输过程中意外填充。见鬼,你可以做一个非常简单的测试:比较buf
的长度和m
的长度。如果它们不一样:修复它。然后检查内容。最终,在您检查是否收到了正确的数据(即dom
和buf
包含完全相同的字节)之前,所有赌注都将取消。是的,您是对的。c#中的字节长度为1024,而golang中的字节长度为56。在下面的代码中,变量大小为56字节,但在这一行中,m=(byte[])ar.AsyncState;变成1024字节的int size=sckCommunication.EndReceiveFrom(ar,ref-epRemote);如果(size>0){//用于帮助我们获取数据字节[]m=new byte[numberBytes];//获取数据m=(byte[])ar.AsyncState;}`感谢问题的解决,我修改了行byte[]m=new byte[numberBytes];to byte[]m=新字节[大小];
action:"move" id:"player_361" room:"SyONuNo0W" pos:<x:74.423 y:-0.04 z:10.903 >