Pregunta

La versión de Python de Google protobuf nos da solamente:

SerializeAsString()

Cuando, como la versión de C ++ nos da tanto:

SerializeToArray(...)
SerializeAsString()

Estamos escribiendo a nuestro archivo de C ++ en formato binario, y nos gustaría mantenerlo así. Dicho esto, hay una manera de leer los datos binarios en Python y analizarlo como si se tratara de una cadena?

Es esta la forma correcta de hacerlo?

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)

Actualización:

He aquí un nuevo ejemplo, y un problema:

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)

Cuando se llega a la línea de foo_bar.ParseFromString(data), me sale este error:

Exception Type: DecodeError
Exception Value: Too many bytes when decoding varint.

Actualización 2:

Resulta, que el relleno en los datos binarios estaba tirando protobuf fuera; demasiados bytes estaban siendo enviados en, como sugiere el mensaje (en este caso se refiere al relleno).

Este relleno proviene del uso de la C ++ función protobuf, SerializeToArray en un tampón de longitud fija. Para eliminar esto, he utilizado este código temproary:

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)

Hay un error de diseño aquí creo. Voy a volver a poner en práctica mi código C ++ para que escriba matrices de longitud variable en el fichero binario. Según las indicaciones de la documentación protobuf, voy a prefijar cada mensaje con su tamaño binario para que yo sepa lo mucho que leer cuando estoy abriendo el archivo con Python.

¿Fue útil?

Solución

No soy un experto con Python, pero se puede pasar el resultado de una operación de file.read() en message.ParseFromString(...) sin tener que construir un nuevo tipo de cadena o nada.

Otros consejos

cadenas de Python pueden contener cualquier carácter, es decir, que son capaces de almacenar datos binarios "" directamente. No debería haber ninguna necesidad de convertir de cadena a "binario".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top