Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 如何解码二进制/原始google protobuf数据_Serialization_Protocol Buffers - Fatal编程技术网

Serialization 如何解码二进制/原始google protobuf数据

Serialization 如何解码二进制/原始google protobuf数据,serialization,protocol-buffers,Serialization,Protocol Buffers,我有一个包含编码protobuf数据的coredump,我想解码这些数据并查看内容。我有一个.proto文件,它在原始协议缓冲区中定义了这个消息。 我的原型文件如下所示: $ 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];

我有一个包含编码protobuf数据的coredump,我想解码这些数据并查看内容。我有一个.proto文件,它在原始协议缓冲区中定义了这个消息。 我的原型文件如下所示:

$  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;
}
和protoc版本:

$  protoc --version
libprotoc 2.3.0
我尝试了以下方法:

  • 从核心转储原始数据

    (gdb)转储内存b.bin 0x7fd70db7e964 0x7fd70db7e96d

  • 把它传给protoc

    //proto文件(my.proto)位于当前目录中

    $protoc--decode--proto_path=$pwd my.proto

    缺少标志的值:--decode

    要解码未知消息,请使用--decode\u raw。

    $protoc——解码原始数据

    无法分析输入。

  • 关于如何破译它有什么想法吗?文档中没有详细说明如何进行

    编辑: 二进制格式的数据(10字节)

    您正确地使用了
    --decode_raw
    ,但您的输入似乎不是protobuf

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

    protoc --decode header my.proto < b.bin
    
    交叉引用字段编号,我们得到:

    u1: 32767
    u2: 8
    u6: 928375
    
    protoc——解码[message\u name][.proto\u file\u path]<[binary\u file\u path]

    在哪里

    • [message_name]是.proto文件中消息对象的名称。如果消息位于.proto文件中的包内,请使用
      package\u name.message\u name
    • [.proto_file_path]是定义消息的.proto文件的路径
    • [二进制文件路径]是要解码的文件的路径
    问题中的情况示例(假设
    my.proto
    b.bin
    在您当前的工作目录中):

    proto——解码头文件my.proto

    proto文件:

    syntax = "proto3";
    package response;
    
    // protoc --gofast_out=. response.proto
    
    message Response {
      int64 UID        
      ....
    }
    
    use protoc:
    protoc --decode=response.Response response.proto < response.bin
    protoc --decode=[package].[Message type] proto.file < protobuf.response
    
    syntax=“proto3”;
    一揽子反应;
    //protoc--gofast_out=。响应.proto
    消息响应{
    int64 UID
    ....
    }
    使用protoc:
    protoc——解码=响应.response.proto
    感谢您的回复,我在上面的问题中添加了原始字节(10字节)。是的,这里只设置了一些可选字段,所以这是预期的。@brokenfoot:在我看来,您提供的字节实际上解析成功了——我编辑了“按答案”以显示这一点。不知何故,
    b.bin
    最后肯定没有完全包含这些字节。您发出的
    dump memory
    命令看起来只能转储9个字节。请记住,转储不包括结束地址处的字节——它最多包括它前面的字节。太好了!我不知道dump memory命令没有在输出中包含最后一个字节。谢谢!有可能传递protoc hex而不是二进制吗?@Arya没有,但是unix命令
    xxd-r-p
    将hex解码为二进制,因此您可以在管道中使用它,如我的回答所示。如果您不是从unix命令行运行protoc,那么您必须想出一些其他的解决方案…谢谢
    package\u name。message\u name
    是我的关键!我想知道
    my.proto
    是否导入了其他proto文件protoc如何找到它们?路径是什么?@dahohu527,感觉备选路径要么是命令行上的当前路径,要么是.proto文件的路径。也许你可以试试看它是哪一个:)提到“引用”到“包名”。。真的很有帮助。谢谢
    u1: 32767
    u2: 8
    u6: 928375
    
    syntax = "proto3";
    package response;
    
    // protoc --gofast_out=. response.proto
    
    message Response {
      int64 UID        
      ....
    }
    
    use protoc:
    protoc --decode=response.Response response.proto < response.bin
    protoc --decode=[package].[Message type] proto.file < protobuf.response