Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌';s protobuf从golang到c#-协议消息包含无效标记(零)_C#_Go_Protocol Buffers - Fatal编程技术网

谷歌';s protobuf从golang到c#-协议消息包含无效标记(零)

谷歌';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

当我使用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的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
的长度。如果它们不一样:修复它。然后检查内容。最终,在您检查是否收到了正确的数据(即do
m
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 >