2016-12-15 7 views
1

午後。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 

は、誰もがどのように私はこの問題を解決することができます知っていますか?私は前の行に印刷されているガベージがあるので文字列が空ではないことを知っていますが、文字列をデータ構造に戻すことができないようです。

答えて

3

リンク先の質問のC++コードが壊れていました。それには次の行が含まれています:

sendto(sock, buf.data(), strlen(buf.c_str()), 0, (struct sockaddr *)&addr, sizeof(addr)); 

これは間違っています!最初のゼロ値バイトでメッセージを切り捨てます。代わりに次のようになります。

sendto(sock, buf.data(), buf.size(), 0, (struct sockaddr *)&addr, sizeof(addr)); 

これは間違いなく表示されるエラーの原因になります。

他の質問を編集してこの修正を追加しました。

関連する問題