首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解码二进制/原始google数据

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

Stack Overflow用户
提问于 2016-01-27 22:50:34
回答 3查看 81.7K关注 0票数 37

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

代码语言:javascript
复制
$  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;
}

和原版:

代码语言:javascript
复制
$  protoc --version
libprotoc 2.3.0

我尝试了以下几点:

  1. 从核心(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d转储原始数据
  2. 将其传递给原型//proto file (my.proto) is in the current dir $ protoc --decode --proto_path=$pwd my.proto < b.bin Missing value for flag: --decode To decode an unknown message, use --decode_raw. $ protoc --decode_raw < /tmp/b.bin Failed to parse input.

对如何破译有什么想法吗?这些文档并没有很好地解释如何解决这个问题。

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

代码语言:javascript
复制
(gdb) x/10xb 0x7fd70db7e964
0x7fd70db7e964: 0x08    0xff    0xff    0x01    0x10    0x08    0x40    0xf7
0x7fd70db7e96c: 0xd4    0x38
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-28 18:36:31

您正确地使用了--decode_raw,但是您的输入似乎不是一个原型。

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

代码语言:javascript
复制
protoc --decode header my.proto < b.bin

但是,如果--decode_raw报告了一个解析错误,那么--decode也会这样做。

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

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

编辑:

添加到问题中的10个字节似乎使用--decode_raw成功解码。

代码语言:javascript
复制
$ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw
1: 32767
2: 8
8: 928375

交叉引用字段号,我们得到:

代码语言:javascript
复制
u1: 32767
u2: 8
u6: 928375
票数 46
EN

Stack Overflow用户

发布于 2018-06-07 11:38:18

protoc --decode [message_name] [.proto_file_path] < [binary_file_path]

哪里

  • message_name是.proto文件中消息对象的名称。如果消息位于.proto文件中的包中,则使用package_name.message_name
  • .proto_file_path是定义消息的.proto文件的路径。
  • binary_file_path是要解码的文件的路径。

问题中的情况示例(假设my.protob.bin位于当前的工作目录中):

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

票数 25
EN

Stack Overflow用户

发布于 2019-09-06 08:52:13

原始文件:

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35049657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档