如何从protobuf-net传输的数据中得到正确的结果

How to get the correct result from the data transmitted by protobuf-net

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

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

ProtoBuf.Serializer.Deserialize(毫秒);

我想把这个数据(bytes)转成字符串,我想用Encoding.UTF8.GetString(bytes);,但是结果是乱码。

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

忘记 UTF8.GetString - 这对这里没有帮助;如果您有有效载荷但没有架构,那么最好的办法是 找到 架构 - 通过询问提供数据的人。您的下一个最佳选择可能是 反向工程 负载中的模式,结合使用 tools like 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);