C# 如何从protobuf网络传输的数据中得到正确的结果

C# 如何从protobuf网络传输的数据中得到正确的结果,c#,protobuf-net,C#,Protobuf Net,我正在用c#编程,需要接收第三方数据(字节)。我只知道这些数据(字节)是通过protobuf网络发送的,但我不知道它的结构(契约) 因为您不知道他的数据结构(合同),所以无法通过以下方式获取数据 ProtoBuf.Serializer.Deserialize(ms) 我想将此数据(字节)转换为字符串,并尝试使用Encoding.UTF8.GetString(字节);,但结果是混乱的 如何在不知道其结构(契约)的情况下将字节转换为正确的数据?忘记UTF8.GetString-这在这里没有帮助;如果

我正在用c#编程,需要接收第三方数据(字节)。我只知道这些数据(字节)是通过protobuf网络发送的,但我不知道它的结构(契约)

因为您不知道他的数据结构(合同),所以无法通过以下方式获取数据

ProtoBuf.Serializer.Deserialize(ms)

我想将此数据(字节)转换为字符串,并尝试使用Encoding.UTF8.GetString(字节);,但结果是混乱的


如何在不知道其结构(契约)的情况下将字节转换为正确的数据?

忘记
UTF8.GetString
-这在这里没有帮助;如果您有一个有效负载,但没有模式,那么最好的办法就是找到模式——询问提供数据的人。您的下一个最佳选择可能是从有效负载反向工程模式,使用实际数据表示的内容(只有您拥有;我只能猜测)和知识的组合

从根本上说,问题在于protobuf二进制格式严重过载;根据来自模式的上下文,完全相同的字节可能意味着非常不同的事情。然而,我经常帮助人们为他们没有定义的数据重建模式,因此完全可以这样做

如果您仅从链接工具执行此操作有困难,我可能会提供更多帮助,但我需要查看数据

-- 对注释中的有效负载进行解码,类似这样的事情应该会起作用-所有标识符(名称)都是纯粹的猜测:

[协议]
公开课Foo{
[原成员(1)]
公共int Id{get;set;}
[原成员(2)]
公共字符串名称{get;set}
[原成员(6)]
公共条{get;set;}
}
[原始合同]
公共类酒吧{
//注意,这也可能是一个十进制数
//protobuf net v3中的兼容级别300
[原成员(2)]
公共字符串A{get;set;}
//对字段4、5、6、7、8、9、10重复此操作
}
然后

var obj=Serializer.Deserialize(源代码);

向第三方索要合同。如果你做不到,请捕获一些示例数据包,希望你能从中得出结构。我不知道protobuf的内部结构,但我猜字符串或字节数组有一个前导长度,所以希望您能发现它们。@Rup有一些工具可以完成它,或者谷歌的
protoc
工具有一个“解码原始”选项;不过,它比JSON或XML等格式更为复杂,也更为微妙。例如(base64):“CAQSB2X0Y19JBMMythifMJK4LJKIBTI5OS42KGUYODKUNTIOMZK5NTGUMDG5NDK3OTG6ETEXNZY4NTQ3LJQ4NDA5NZK4QYWLJAYNJFKBTI5OC43UGUYOTGUQ=”通过您的链接,仍然没有得到正确的答案structure@231243k,我可以稍后再看一看;现在在手机上你确定你没有得到正确的结构吗?Marc的protogen为我提供了合理的输出:varint,string,然后是一个包含八个字符串的子对象;请参阅edit如果我必须接受多个数据、多个结构,如何确定每个数据的相应结构。例如,前一分钟你有一个结构a,下一分钟你有一个结构B,下一分钟你有一个结构C或a或B。。。随机返回一个B C结构。唯一的办法就是“试抓”?