を私はわかりません私はあなたの質問に全く答えているが、私はあなたに例を挙げるだろう。 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
または何を。
詳細な説明をありがとうが、これは本当に私の問題を解決しません。私は外部サーバーをあまり制御しておらず、Protocol_pb2.pyファイルを生成するコードを変更することはできません。私がそれを解析できるように、C++コードによって生成された.pbバイナリファイルを逆シリアル化する必要があります。 –
ああ、私はあなたが完全に間違っていると理解していた。 .proto-fileにアクセスできません。実際には、私はあなたが何を望んでいるのか理解できないかもしれません:Sあなたの目標は何ですか?何とか.pbバイナリからpb2.pyを生成したいですか? –
あなたの答えは私が正しい方向に進むのを助けました。プロトコルを理解するのが直感的ではなく、私が説明するのが難しいと言ってみましょう。私はprotoファイルを持っていますが、_pb2.pyファイルはまだありません。私はちょうど私のprotoファイルをPythonに送り、_pb2.pyで出力する必要があることを理解しました。それから私は解析する方法を理解することができます。現在、私は複雑なアプリケーションを持っているので、単一の出力でコンパイルされたすべてのprotoファイルを収集する必要があります。 –