2016-12-15 3 views
1

Guten Tag.Google Protobuf - UDP-Kommunikation zwischen C++ und Python - google.protobuf.message.DecodeError: entpacken erfordert ein String-Argument der Länge 4

Ich versuche, eine Nachricht zwischen einem Framework in CPP und einem anderen in Python zu senden. Ich folgte das gleiche Verfahren gezeigt auf: Serialize C++ object to send via sockets to Python - best approach?

Mein Server-Code in Python ist:

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)) 

Die .proto Datei ist folgende:

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; 
} 

Ich weiß, dass die Kommunikation funktioniert, weil der Server die erste Nachricht erhält und als Müll ausgibt. Doch nachdem er die ParseFromString Linie erreicht, wird der folgende Fehler tritt auf:

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 

niemanden weiß, wie kann ich dieses Problem lösen? Ich weiß, dass die Zeichenfolge nicht leer ist, weil auf der vorherigen Zeile Müll gedruckt wird, aber ich kann nicht in der Lage sein, die Zeichenfolge zurück in die Datenstruktur zu konvertieren.

Antwort

3

Der C++ - Code in der Frage, mit der Sie verbunden waren, war defekt. Es enthält diese Zeile:

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

Das ist falsch! Es wird die Nachricht an dem ersten nullwertigen Byte abgeschnitten. Es sollte stattdessen so aussehen:

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

Dies würde definitiv den Fehler verursachen, den Sie sehen.

Ich habe die andere Frage bearbeitet, um diesen Fix hinzuzufügen.

Verwandte Themen