web-dev-qa-db-ja.com

バイナリ/生のGoogle Protobufデータをデコードする方法

エンコードされた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
_

私は次を試しました:

  1. コアから生データをダンプします

    _(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d_

  2. 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
_
14
brokenfoot

--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
20
Kenton Varda

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

7
Hemaolle

プロトファイル:

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
0