serialization - 如何解码二进制/原始谷歌 protobuf 数据

标签 serialization protocol-buffers

我有一个带有编码的 protobuf 数据的 coredump,我想解码这些数据并查看内容。我有在原始 Protocol Buffer 中定义此消息的 .proto 文件。
我的原型(prototype)文件如下所示:

$  cat my.proto 
message header {
  required uint32 u1 = 1;
  required uint32 u2 = 2;
  optional uint32 u3 = 3 [default=0];
  optional bool   b1 = 4 [default=true];
  optional string s1 = 5;
  optional uint32 u4 = 6;
  optional uint32 u5 = 7;
  optional string s2 = 9;
  optional string s3   = 10; 
  optional uint32 u6 = 8;
}

和协议(protocol)版本:
$  protoc --version
libprotoc 2.3.0

我尝试了以下方法:
  • 从核心转储原始数据
    (gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d
  • 将其传递给 protoc
    //proto file (my.proto) is in the current dir$ protoc --decode --proto_path=$pwd my.proto < b.binMissing value for flag: --decodeTo decode an unknown message, use --decode_raw.$ protoc --decode_raw < /tmp/b.binFailed to parse input.

  • 关于如何解码的任何想法?该文档没有详细说明如何进行操作。

    编辑 :
    二进制格式的数据(10 字节)
    (gdb) x/10xb 0x7fd70db7e964
    0x7fd70db7e964: 0x08    0xff    0xff    0x01    0x10    0x08    0x40    0xf7
    0x7fd70db7e96c: 0xd4    0x38
    

    最佳答案

    你用过--decode_raw正确,但您的输入似乎不是 protobuf。

    对于 --decode ,您需要指定类型名称,例如:

    protoc --decode header my.proto < b.bin
    

    但是,如果 --decode_raw报告解析错误而不是 --decode也会。

    您通过 gdb 提取的字节似乎不是有效的 protobuf。也许您的地址并不完全正确:如果您在任一端添加或删除了一个字节,它可能不会解析。

    我注意到根据您指定的地址,protobuf 只有 9 个字节长,仅够设置三四个字段的空间。这是你所期待的吗?也许您可以在此处发布字节。

    编辑:

    您添加到问题中的 10 个字节似乎使用 --decode_raw 成功解码:
    $ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw
    1: 32767
    2: 8
    8: 928375
    

    交叉引用字段编号,我们得到:
    u1: 32767
    u2: 8
    u6: 928375
    

    关于serialization - 如何解码二进制/原始谷歌 protobuf 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049657/

    相关文章:

    java - 我需要将proto3版本中protobuf生成的java代码添加到nutch 1.7

    python - 拆分转义分隔符

    java - 关于 Hadoop 中的序列化 : what are the advantages of serialization?

    c# - 如何深入比较不可序列化的对象?

    java - 为多个版本的 Hadoop 编写 Java 代码的好方法是什么?

    java - 使用 Jackson 将 protobuf 转换为 JSON?

    java - 如何处理 protobuf3 消息中的可空枚举类型字段?

    java - 反序列化是如何工作的?

    c# - ASP.NET - 在不序列化的情况下保存在 View 状态中

    c++ - Cap'n Proto 在抛出 'kj::ExceptionImpl' 实例后终止调用