1

我正在查看我的机器上发生的一些网络请求,我发现其中一些请求使用的是Microsoft Bond数据序列化格式。我想反序列化请求的内容,但我没有用于创建其内容的架构。

我知道使用 ProtoBuf 编译器,有一种方法可以在没有架构的情况下输出基于 ProtoBuf 的二进制文件的内容,例如:

protoc --decode_raw < data.proto

Microsoft Bond 是否有类似的功能?我很高兴编写 C#/C++ 代码来完成这项工作,但很好奇这是否可能。

作为参考,协议是Compact Binary

4

1 回答 1

1

感谢Christopher Warrington的一些见解,我能够拼凑出一种方法,通过该方法可以将 Bond 编码的紧凑型二进制内容片段“解包”到其组件片段中:

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();
}

是非生产代码(您可以发现许多问题和缺乏嵌套解析),但它显示了获取内容的方法。

于 2022-01-28T00:03:06.973 回答