2016-10-26 3 views
2

Google Protobufはこれまで以上に私を混乱させ、私は物事の仕組みを理解しようとしています。Google Protobufバイナリファイルをデシリアライズ

  1. これを正しく理解しているかどうか理解してください。 .protoファイルはメッセージの定義を定義し、protocはコンパイラです。データはバイナリファイル(.pb)でコンパイルされます。正しい?そうでない場合は、理解してもらえますか?私はGoogle Protobufドキュメントを処理できません。それはかなり混乱しています。そしてStack Overflowや他のブログで運がなかった。

  2. 重要:は、ロジックが定義されているC++コードを変更できません。それが言われて、filename.pb(バイナリファイル)を逆シリアル化し、結果をPythonで解析したいと思います。これは可能ですか?

ご協力いただきありがとうございます。

答えて

3

を私はわかりません私はあなたの質問に全く答えているが、私はあなたに例を挙げるだろう。 Protocol_pb2.pyを取得したら、protobufのPython API(場合によってはstruct)で簡単にメッセージを解析できます。私はprotobufの専門家ではないが、私は少なくともMumbleのメッセージを解析している。さて、私はあなたがprotobufをどのように使っているのか正確にはわかりませんが、この例では(protobufを使っている)メッセージを解析する方法を示しています。だから、:

インポートprotoc-作成いるProtobufファイル(あなたは私があなたの最後の質問に答えた方法でそれを作成します)&構造体:

import struct 
import Mumble_pb2 as mumble_protobuf 

mumble_protobufモジュールは、あなたの中で定義されたさまざまなメッセージが含まれています.protoファイルをPython形式に変換します。私はここに物事を飛ばしてる

PACKET_TYPES = { 
    0: mumble_protobuf.Version, 
    1: mumble_protobuf.UDPTunnel, 
    2: mumble_protobuf.Authenticate, 
... 

いますが、パケットのバイナリデータを受信したら、あなたはそれを解析することができます:あなたは、例えば辞書に異なるメッセージタイプを保存することができます。私は、それぞれのアプリケーションが異なる方法で動作すると仮定しますが、例えば、mumbleは、メッセージタイプを含む2バイトの接頭辞を持つprotobufメッセージと、パケット長を示す4バイトを送信します。これはおそらくあなたのアプリケーションでは異なって行われます。どのような場合でも、(プロトコルに複数のメッセージタイプがあると仮定して)どのような種類のメッセージを解析するのか何とか知る必要があります。しかし、例として:

バッファに複数のメッセージがある場合、パケット長に基づいてバッファからパケットデータを抽出する必要があります。メッセージタイプを知ったら、それを解析することができます。この部分は、pb2ファイルからメッセージタイプに対応するクラスをフェッチし、それに基づいてメッセージを解析します。

MessageClass = PACKET_TYPES[packet_type] 
message = MessageClass() 
message.ParseFromString(packet_data) 

messageは最終的に解析されいるProtobufメッセージが含まれています、そしてあなたが1を構築するだろうというときのように、あなたはそれを使用することができます:あなたは、フィールドなどに参照することができます。message.UserNameまたは何を。

+0

詳細な説明をありがとうが、これは本当に私の問題を解決しません。私は外部サーバーをあまり制御しておらず、Protocol_pb2.pyファイルを生成するコードを変更することはできません。私がそれを解析できるように、C++コードによって生成された.pbバイナリファイルを逆シリアル化する必要があります。 –

+0

ああ、私はあなたが完全に間違っていると理解していた。 .proto-fileにアクセスできません。実際には、私はあなたが何を望んでいるのか理解できないかもしれません:Sあなたの目標は何ですか?何とか.pbバイナリからpb2.pyを生成したいですか? –

+0

あなたの答えは私が正しい方向に進むのを助けました。プロトコルを理解するのが直感的ではなく、私が説明するのが難しいと言ってみましょう。私はprotoファイルを持っていますが、_pb2.pyファイルはまだありません。私はちょうど私のprotoファイルをPythonに送り、_pb2.pyで出力する必要があることを理解しました。それから私は解析する方法を理解することができます。現在、私は複雑なアプリケーションを持っているので、単一の出力でコンパイルされたすべてのprotoファイルを収集する必要があります。 –

-2

はい、protocによって生成されたPythonコードを使用して、protobufメッセージを逆シリアル化することができます。 protocコンパイラはあなたのターゲット言語(あなたのケースではpythonC++)でコードを出力します。ここで

は助けることができるいくつかのリソースです:

  1. 読書とPythonでファイルを書き込む:プロトコルバッファメッセージの https://docs.python.org/2/tutorial/inputoutput.html
  2. Pythonのチュートリアル: https://developers.google.com/protocol-buffers/docs/pythontutorial
+0

この多くの情報は、あなたが投稿したものへのGoogle検索ポイントの最初の数少ないリンクをすぐに利用できます。質問者は詳細を求めています。 – Tanny

関連する問題