如何解码 binary/raw google protobuf 数据
How to decode binary/raw google protobuf data
我有一个带有编码 protobuf 数据的核心转储,我想解码此数据并查看内容。我有在原始协议缓冲区中定义此消息的 .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 --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.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 字节)
(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个字节长,只够space设置三四个字段。那是你期待的吗?也许你可以 post 这里的字节数。
编辑:
您添加到问题中的 10 个字节似乎使用 --decode_raw
:
成功解码
$ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw
1: 32767
2: 8
8: 928375
交叉引用字段编号,我们得到:
u1: 32767
u2: 8
u6: 928375
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.proto
和 b.bin
在您当前的工作目录中):
protoc --decode header my.proto < b.bin
原型文件:
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
我有一个带有编码 protobuf 数据的核心转储,我想解码此数据并查看内容。我有在原始协议缓冲区中定义此消息的 .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 --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.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 字节)
(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个字节长,只够space设置三四个字段。那是你期待的吗?也许你可以 post 这里的字节数。
编辑:
您添加到问题中的 10 个字节似乎使用 --decode_raw
:
$ echo 08ffff01100840f7d438 | xxd -r -p | protoc --decode_raw
1: 32767
2: 8
8: 928375
交叉引用字段编号,我们得到:
u1: 32767
u2: 8
u6: 928375
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.proto
和 b.bin
在您当前的工作目录中):
protoc --decode header my.proto < b.bin
原型文件:
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