エンコードされた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バージョン:
_$ 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
を正しく使用しましたが、入力がプロトバフではないようです。
--decode
の場合、次のようにタイプ名を指定する必要があります。
protoc --decode header my.proto < b.bin
ただし、--decode_raw
が解析エラーを報告する場合、--decode
も報告します。
Gdbで抽出したバイトは有効なprotobufではないようです。おそらくあなたのアドレスは正確ではありません。どちらかの端でバイトを追加または削除した場合、おそらく解析されません。
指定したアドレスによれば、protobufの長さはわずか9バイトであり、これは3つまたは4つのフィールドを設定するのに十分なスペースであることに注意してください。それはあなたが期待していることですか?おそらく、ここにバイトを投稿できます。
編集:
質問に追加した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]
、
どこ
package_name.message_name
。質問の状況の例(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