不知道底层架构的 Microsoft Bond 反序列化
Microsoft Bond deserialization without knowing underlying schema
我正在查看我机器上发生的一些网络请求,我发现其中一些请求使用了 Microsoft Bond 数据序列化格式。我想反序列化请求的内容,但我没有用于创建其内容的架构。
我知道使用 ProtoBuf 编译器,有一种方法可以输出基于 ProtoBuf 的二进制文件的内容,而无需模式,例如:
protoc --decode_raw < data.proto
Microsoft Bond 有类似的东西吗?我很高兴编写 C#/C++ 代码来完成这项工作,但我很好奇这是否可能。
作为参考,协议是 Compact Binary。
感谢一些见解 from Christopher Warrington,我能够拼凑出一种方法,通过该方法可以将 Bond-encoded Compact Binary 内容片段“解压缩”为其组成部分:
var ib = new Bond.IO.Unsafe.InputBuffer(File.ReadAllBytes("response_data.bin"));
var cbr = new CompactBinaryReader<Bond.IO.Unsafe.InputBuffer>(ib, 2);
cbr.ReadStructBegin();
BondDataType dt = BondDataType.BT_BOOL;
ushort id = 0;
while (dt != BondDataType.BT_STOP)
{
cbr.ReadFieldBegin(out dt, out id);
Console.WriteLine(dt + " " + id);
if (dt == BondDataType.BT_STRING)
{
var stringValue = cbr.ReadString();
Console.WriteLine(stringValue);
}
else if (dt == BondDataType.BT_LIST)
{
BondDataType listContent = BondDataType.BT_BOOL;
int counter = 0;
cbr.ReadContainerBegin(out counter, out listContent);
Console.WriteLine("Inside container: " + listContent);
if (listContent == BondDataType.BT_STRUCT)
{
BondDataType structDt = BondDataType.BT_BOOL;
cbr.ReadStructBegin();
while(structDt != BondDataType.BT_STOP)
{
cbr.ReadFieldBegin(out structDt, out id);
Console.WriteLine(structDt + " " + id);
if (structDt == BondDataType.BT_STRING)
{
var stringValue = cbr.ReadString();
Console.WriteLine(stringValue);
}
else
{
if (structDt != BondDataType.BT_STOP)
{
cbr.Skip(structDt);
}
}
}
cbr.ReadStructEnd();
}
cbr.ReadContainerEnd();
}
else
{
if (dt != BondDataType.BT_STOP)
{
cbr.Skip(dt);
}
}
cbr.ReadFieldEnd();
}
这是 non-production 代码(您可以发现许多问题和缺少嵌套解析)但它显示了获取内容的方法。
我正在查看我机器上发生的一些网络请求,我发现其中一些请求使用了 Microsoft Bond 数据序列化格式。我想反序列化请求的内容,但我没有用于创建其内容的架构。
我知道使用 ProtoBuf 编译器,有一种方法可以输出基于 ProtoBuf 的二进制文件的内容,而无需模式,例如:
protoc --decode_raw < data.proto
Microsoft Bond 有类似的东西吗?我很高兴编写 C#/C++ 代码来完成这项工作,但我很好奇这是否可能。
作为参考,协议是 Compact Binary。
感谢一些见解 from Christopher Warrington,我能够拼凑出一种方法,通过该方法可以将 Bond-encoded Compact Binary 内容片段“解压缩”为其组成部分:
var ib = new Bond.IO.Unsafe.InputBuffer(File.ReadAllBytes("response_data.bin"));
var cbr = new CompactBinaryReader<Bond.IO.Unsafe.InputBuffer>(ib, 2);
cbr.ReadStructBegin();
BondDataType dt = BondDataType.BT_BOOL;
ushort id = 0;
while (dt != BondDataType.BT_STOP)
{
cbr.ReadFieldBegin(out dt, out id);
Console.WriteLine(dt + " " + id);
if (dt == BondDataType.BT_STRING)
{
var stringValue = cbr.ReadString();
Console.WriteLine(stringValue);
}
else if (dt == BondDataType.BT_LIST)
{
BondDataType listContent = BondDataType.BT_BOOL;
int counter = 0;
cbr.ReadContainerBegin(out counter, out listContent);
Console.WriteLine("Inside container: " + listContent);
if (listContent == BondDataType.BT_STRUCT)
{
BondDataType structDt = BondDataType.BT_BOOL;
cbr.ReadStructBegin();
while(structDt != BondDataType.BT_STOP)
{
cbr.ReadFieldBegin(out structDt, out id);
Console.WriteLine(structDt + " " + id);
if (structDt == BondDataType.BT_STRING)
{
var stringValue = cbr.ReadString();
Console.WriteLine(stringValue);
}
else
{
if (structDt != BondDataType.BT_STOP)
{
cbr.Skip(structDt);
}
}
}
cbr.ReadStructEnd();
}
cbr.ReadContainerEnd();
}
else
{
if (dt != BondDataType.BT_STOP)
{
cbr.Skip(dt);
}
}
cbr.ReadFieldEnd();
}
这是 non-production 代码(您可以发现许多问题和缺少嵌套解析)但它显示了获取内容的方法。