2017-01-02 2 views
0

protobufを使用するプログラムで作成されたファイルからraw protobufメッセージを取得しようとしています。私はソースプログラムなどを所有していませんが、protoc --decode_rawの出力に満足しています。残念ながら、 "入力を解析できませんでした"というエラーが表示されるため、これは機能しません。これは、ファイル内のprotobufデータのヘッダーがあるためです。ソースプログラムはDOTA2で、ファイルは次のように始まります。ファイルのどの部分がヘッダーで、何がprotobufメッセージなのかを確認する

50 42 44 45 4d 53 32 00 f0 54 0e 03 f7 bf 0d 03 
01 ff ff ff ff 0f 7b 0a 08 50 42 44 45 4d 53 32 
00 10 2c 1a 2e 56 61 6c 76 65 20 44 6f 74 61 20 
32 20 45 55 20 4e 6f 72 74 68 20 53 65 72 76 65 
72 20 28 73 72 63 64 73 31 32 35 2e 31 38 35 2e 
36 34 29 22 0d 53 6f 75 72 63 65 54 56 20 44 65 
6d 6f 2a 05 73 74 61 72 74 32 1f 2f 6f 70 74 2f 
73 72 63 64 73 2f 64 6f 74 61 2f 64 6f 74 61 5f 
76 31 38 33 31 2f 64 6f 74 61 38 02 40 01 48 01 
52 00 08 ff ff ff ff 0f 11 08 01 10 01 1a 0b 44 
02 82 e8 01 08 00 0a 00 0c 00 08 ff ff ff ff 0f 
16 08 02 10 02 1a 10 d3 34 28 14 cc d1 85 c9 d1 
41 e0 b3 46 47 06 20 08 ff ff ff ff 0f e7 03 08 
03 10 03 1a e0 03 98 70 0f 20 d4 26 40 10 60 04 
80 04 c0 b0 f5 e0 59 d1 48 40 01 61 91 17 80 01 
b4 25 22 22 f4 c8 7d bc bc c1 d1 bd cc c9 8d 91 
cd bd 90 bd d1 85 bd 90 bd d1 85 7d d9 c5 e0 cc 
c4 bc 90 bd d1 85 e9 15 cc d1 85 c9 d1 29 06 20 
4c bd d5 c9 8d 95 51 59 49 06 00 68 06 ac 06 20 

私は少しわからないんですので、ヘッダが終了しているProtobufメッセージが始まるこのファイルをデコードしようとする前にいるProtobufを使用して、知識や経験全くありません。私はかなり ".. v1831/dota8"までヘッダーの一部だと確信していますが、これを削除するとまだ入力の問題を解析できません。

このタイプのファイルに関する詳細はネット上を見てきました(これはDOTA2のデモダウンロードです)。この種のタスクを行う他のプログラムもありますが、明確なカットは見つかりませんヘッダ長に関する情報。私はprotobufについて学ぶためにこれを部分的に使用しているので、別のアプリケーションを使うことは、私が探しているものではありません。

私は最終的にvb.netでこれを動作させるつもりですので、私はprotobuf-netを使用しています(これは質問/回答には関係ありませんが、ちょうどその場合はhereです)。

+0

データの16進ダンプを提供できる場合は、ヘッダーを把握できる可能性があります。しかし、あなたはテキストだけを提供しています。これは、ビットの束が失われていることを意味します。私の最高の推測は、最初の8バイトが "マジックナンバー"であり、それからprotobufデータが始まるということです。 –

+0

@KentonVarda数分前にあなたのコメントを完全に逃しました!テキストの代わりに16進数ダンプを使って質問を更新しました。どんな推測? – FraserOfSmeg

答えて

2

最初の33バイトがヘッダーです。ヘッダーは8バイトのシーケンス "PBDEMS2 \ 0"(\ 0、別名NULバイトを含む)で始まり、終わります。 protobufデータは、2番目の "PBDEMS2 \ 0"(NULバイトの後のバイト)の直後に開始されます。

あなたはデータの先頭だけを提供していましたので、protoc --decode_rawにフィードしようとするとデータが途中で終了するためにエラーが発生します。しかし、復号化は、手動でデータは次のように出始めるようです:

2: 44 
3: "Valve Dota 2 EU North Server (srcds125.185.64)" 
4: "SourceTV Demo" 
5: "start" 
6: "/opt/srcds/dota/dota_v1831/dota" 
7: 2 
8: 1 
9: 1 
10: "" 
1: 4294967295 // (probably actually -1) 
2: 0x02440b1a01100108 

しかし、これは疑わしいです:フィールド番号はますます順だったし、その後、突然また、フィールド2は、異なるタイプを持っていることに気づくバック1から始まっていることに注意してください2回目。私たちがここに目にしているのは、おそらく異なるタイプの複数のメッセージであると思います。

残念ながら、メッセージがどこで終了し、次のメッセージがどこから始まるのかを伝えるのは難しいです。おそらくヘッダーがあなたに伝えますが、私はそれをどのように解読するのか分かりません。ヘッダーはprotobuf形式ではないようです。

+0

感謝しているようです。 protoc --decode_rawをファイルに使用することはできません(最初の33バイトを削除しても)。手動でどのようにデコードしましたか? – FraserOfSmeg

+0

https://developers.google.com/protocol-buffers/docs/encoding - 形式はあまり複雑ではありません。つまり、私はそれを何度か実行したことで恩恵を受けました。 :) –

+0

もう一度ありがとう。私は少し時間を費やしてこれを試してみるつもりですし、おそらく私自身の実装をまとめるつもりです! – FraserOfSmeg

関連する問題