2

我有以下 protobuf 文本,并想在 C# 中反序列化。我已经尝试了下面的代码,但它一直抛出错误'类型不是预期的,并且无法推断出任何合同: System.Object。我知道我需要一个模式是否有办法将 protobuf 文本数据转换为字符串或 Json。我正在使用 Marc Gavell 库 protobuf-net。

public void DeserializeProtobuf()
{
    var path = $"../../protobufSingleEntry.txt";              
    byte[] byteArray = Encoding.UTF8.GetBytes(path);
    MemoryStream stream = new MemoryStream(byteArray);

    Serializer.Deserialize<object>(stream);
}

protobufSingleEntry.txt

00000000: 7e6d 7e37 357e 6d7e 0829 1247 0a0f 7173  ~m~75~m~.).G..qs
00000001: 5f67 554d 4463 7556 514e 6837 3912 0f42  _gUMDcuVQNh79..B
00000002: 494e 414e 4345 3a42 5443 5553 4454 1a02  INANCE:BTCUSDT..
00000003: 6f6b 293d 0ad7 a3b0 7cc6 4035 0ad7 73c3  ok)=....|.@5..s.
00000004: 3de1 7a04 c051 5c05 31d0 037d cc40 9a01  =.z..Q\.1..}.@..
00000005: 027b 7d7e 6d7e 3735 7e6d 7e08 2912 470a  .{}~m~75~m~.).G.
00000006: 0f71 735f 4e7a 784f 7a4a 4d79 4277 6b6b  .qs_NzxOzJMyBwkk
00000007: 120f 4249 4e41 4e43 453a 4254 4355 5344  ..BINANCE:BTCUSD
00000008: 541a 026f 6b29 3d0a d7a3 b07c c640 350a  T..ok)=....|.@5.
00000009: d773 c33d e17a 04c0 515c 0531 d003 7dcc  .s.=.z..Q\.1..}.
0000000a: 409a 0102 7b7d                           @...{}
4

1 回答 1

1

这里的问题是:protobuf 是一种模棱两可的格式。根据仅在模式中已知的信息,相同的字节可能意味着非常不同的事物。例如,原始二进制 ( bytes) 有效负载、文本字符串、子消息和“打包”原始值都共享完全相同的标记。同样,对于大多数原始类型,有多种表示相同value的方式,而且所有原始类型在它们的编码方式上也有重叠。

当然可以在没有模式的情况下抽象地解码数据- 一切都可以视为未知字段,您可以通过 API 查询未知字段。但这仍然不能帮助您实际解释数据,因为再次:您需要知道您期望应用正确解码的内容。

IMO 你最好的选择是对架构进行逆向工程。您可以从https://protogen.marcgravell.com/decode开始以显示实际有效负载包含的内容,然后从那里开始将它们拼凑在一起。

于 2019-07-14T09:05:50.570 回答