c# - 如何从 protobuf-net 传输的数据中得到正确的结果
问题描述
我正在用 c# 编程,需要接收第三方数据(字节)。我只知道这个数据(字节)是通过protobuf-net发送的,但我不知道它的结构(契约)是什么。
因为不知道他的数据结构(合约),所以无法通过以下方式获取数据
ProtoBuf.Serializer.Deserialize(ms);
我想将此数据(字节)转换为字符串,我正在尝试使用 Encoding.UTF8.GetString(bytes);,但结果是乱码。
如何在不知道他的结构(合同)的情况下将字节转换为正确的数据?
解决方案
忘掉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);
推荐阅读
- php - 究竟是什么导致了每六个月一小时的时间计算错误?
- r - 如何在 ggplotly 中自定义工具提示?
- javascript - 在 Math.js 中添加/乘以符号表达式
- css - 位置:固定;不工作。(可能我不知道怎么用)
- node.js - React 模块找不到 apollo 客户端
- java - 从用户获取分隔符的Java方法
- flutter - 我正在安装颤振 - 在 \n 附近解析错误
- tensorflow - 用形状分配张量时的OOM - 如何获得更多的GPU内存
- python - 如何对整数列表中的所有单个整数(整数的一部分)求和?
- python - 如何在应用程序的某些点使用破折号加载