午後。Google Protobuf - C++とPython間のUDP通信 - google.protobuf.message.DecodeError:unpackには、長さ4の文字列引数が必要です。
CPPの1つのフレームワークとPythonの別のフレームワークの間でメッセージを送信しようとしています。私は上に示され、同じプロセスをたどっ: Serialize C++ object to send via sockets to Python - best approach?
Pythonで私のサーバーのコードは次のとおりです。
import socket
from DiceData_pb2 import DiceData
UDP_PORT=1555
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", UDP_PORT))
dicedata = DiceData()
while True:
data, addr = sock.recvfrom(1024)
print data
dicedata.ParseFromString(data)
print ("gyrox = {0}".format(dicedata.gyrox))
print("gyroy = {0}".format(dicedata.gyrox))
print("gyroz = {0}".format(dicedata.gyroz))
print("accelx = {0}".format(dicedata.accelx))
print("accely = {0}".format(dicedata.accely))
print("accelz = {0}".format(dicedata.accelz))
print("roll = {0}".format(dicedata.roll))
print("pitch = {0}".format(dicedata.pitch))
print("yaw = {0}".format(dicedata.yaw))
print("side = {0}".format(dicedata.side))
print("certainty = {0}".format(dicedata.certainty))
print("time = {0}".format(dicedata.time))
.protoファイルは以下の通りです:
package prototest;
message DiceData {
required float gyrox = 1;
required float gyroy = 2;
required float gyroz = 3;
required float accelx = 4;
required float accely = 5;
required float accelz = 6;
required float roll = 7;
required float pitch = 8;
required float yaw = 9;
required int32 side = 10;
required float certainty = 11;
required string time = 12;
}
私は通信が働いている知っています、サーバーが最初のメッセージを受信し、それをガベージとして印刷するためです。しかし、それはParseFromStringラインに到達した後、次のエラーが起こる:
Traceback (most recent call last):
File "server.py", line 13, in <module>
dicedata.ParseFromString(data)
File "/usr/local/lib/python2.7/dist-packages/google/protobuf/message.py", line 185, in ParseFromString
self.MergeFromString(serialized)
File "/usr/local/lib/python2.7/dist-packages/google/protobuf/internal/python_message.py", line 1095, in MergeFromString
raise message_mod.DecodeError(e)
google.protobuf.message.DecodeError: unpack requires a string argument of length 4
は、誰もがどのように私はこの問題を解決することができます知っていますか?私は前の行に印刷されているガベージがあるので文字列が空ではないことを知っていますが、文字列をデータ構造に戻すことができないようです。