Wie kann ich binäre C ++ protobuf Daten unter Verwendung von Python protobuf lesen?
-
13-09-2019 - |
Frage
Die Python-Version von Google protobuf gibt uns nur:
SerializeAsString()
Wo, wie die C ++ Version gibt uns beide:
SerializeToArray(...)
SerializeAsString()
Wir schreiben an unsere C ++ Datei im Binärformat, und wir möchten, dass es auf diese Weise halten. Das heißt, gibt es einen Weg, um die Binärdaten in Python von Lesen und Parsen es, als ob es sich um eine Zeichenfolge waren?
Ist dies der richtige Weg, es zu tun?
binary = get_binary_data()
binary_size = get_binary_size()
string = None
for i in range(len(binary_size)):
string += i
message = new MyMessage()
message.ParseFromString(string)
Update:
Hier ist ein neues Beispiel, und ein Problem:
message_length = 512
file = open('foobars.bin', 'rb')
eof = False
while not eof:
data = file.read(message_length)
eof = not data
if not eof:
foo_bar = FooBar()
foo_bar.ParseFromString(data)
Als wir in der foo_bar.ParseFromString(data)
Linie bekommen, erhalte ich diese Fehlermeldung:
Exception Type: DecodeError
Exception Value: Too many bytes when decoding varint.
Update 2:
Es stellt sich heraus, dass die Polsterung auf den binären Daten protobuf off wirft; zu viele Bytes gesendet wurden in zu werden, da die Nachricht schlägt vor (in diesem Fall ist es an der Polsterung bezog).
Diese Polsterung kommt aus dem protobuf Funktion SerializeToArray
auf einem Puffer mit fester Länge ++ C verwendet wird. Um dies zu beseitigen, habe ich diesen temproary Code verwendet:
message_length = 512
file = open('foobars.bin', 'rb')
eof = False
while not eof:
data = file.read(message_length)
eof = not data
string = ''
for i in range(0, len(data)):
byte = data[i]
if byte != '\xcc': # yuck!
string += data[i]
if not eof:
foo_bar = FooBar()
foo_bar.ParseFromString(string)
Es ist ein Konstruktionsfehler hier, denke ich. Ich werde meinen C ++ Code neu implementieren, so dass es mit variabler Länge Arrays auf die binäre Datei schreibt. Wie von der protobuf Dokumentation geraten, werde ich jede Nachricht Präfix damit binäre Größe ist, so dass ich weiß, wie viel zu lesen, wenn ich die Datei mit Python bin zu öffnen.
Lösung
Ich bin kein Experte mit Python, aber das Ergebnis eines file.read()
Betrieb in message.ParseFromString(...)
, ohne bauen einen neuen String-Typ oder sonst etwas.
Andere Tipps
Python strings beliebiges Zeichen enthalten kann, das heißt, sie sind in der Lage „binäre“ Daten direkt zu halten. Es sollte keine Notwendigkeit, von Zeichenfolge konvertieren zu „binary“.