首页 > 解决方案 > 如何从 protobuf-net 传输的数据中得到正确的结果

问题描述

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

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

ProtoBuf.Serializer.Deserialize(ms);

我想将此数据(字节)转换为字符串,我正在尝试使用 Encoding.UTF8.GetString(bytes);,但结果是乱码。

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

标签: c#protobuf-net

解决方案


忘掉UTF8.GetString——这在这里无济于事;如果您有有效负载但没有架构,那么最好的办法是找到架构 - 通过询问提供数据的人。您的下一个最佳选择可能是使用protogen 等工具的组合对有效负载中的模式进行逆向工程,并了解实际数据所代表的内容(只有您拥有;我只能猜测)。

从根本上说,问题在于 protobuf 二进制格式严重过载。根据来自模式的上下文,完全相同的字节可能意味着非常不同的东西。但是,我经常帮助人们为他们没有定义的数据重建模式,所以它绝对可以完成。

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

-- 在评论中解码有效载荷,这样的事情应该可以工作 - 所有标识符(名称)都是纯粹的猜测:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public string Name {get;set}

    [ProtoMember(6)]
    public Bar Bar {get;set;}
}
[ProtoContract]
public class Bar {
    // Note this could also be a decimal under
    // Compat level 300 in protobuf-net v3
    [ProtoMember(2)]
    public string A {get;set;}
    // Repeat for fields 4, 5, 6, 7, 8, 9, 10
}

然后

var obj = Serializer.Deserialize<Foo>(source);

推荐阅读