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.

War es hilfreich?

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.

passieren kann

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“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top