Domanda

La versione di Python di Google protobuf ci dà solo:

SerializeAsString()

Dove come la versione C ++ ci dà entrambi:

SerializeToArray(...)
SerializeAsString()

Ti scriviamo per il nostro file C ++ in formato binario, e ci piacerebbe continuare in questo modo. Detto questo, c'è un modo di leggere i dati binari in Python e analisi come se si trattasse di una stringa?

E 'questo il modo corretto di farlo?

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)

Aggiornamento:

Ecco un nuovo esempio, e 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)

Quando arriviamo alla linea foo_bar.ParseFromString(data), ottengo questo errore:

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

Aggiornamento 2:

Si scopre, che l'imbottitura sui dati binari stava gettando protobuf off; troppi byte venivano inviati in, come il messaggio suggerisce (in questo caso si riferiva all'imbottitura).

Questo imbottitura deriva dall'uso C ++ funzione protobuf, SerializeToArray su un buffer di lunghezza fissa. Per eliminare questo, ho usato questo codice 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)

C'è un difetto di progettazione qui credo. Io re-implementare il mio codice C ++ in modo che scrive gli array di lunghezza variabile al file binario. Come consigliato dalla documentazione protobuf, io prefisso ogni messaggio con il suo formato binario in modo che io so quanto leggere quando sto aprendo il file con Python.

È stato utile?

Soluzione

Io non sono un esperto con Python, ma è possibile passare il risultato di un'operazione file.read() in message.ParseFromString(...) senza dover costruire un nuovo tipo di stringa o nulla.

Altri suggerimenti

stringhe Python possono contenere qualsiasi carattere, cioè esse sono in grado di contenere direttamente dati "binarie". Non ci dovrebbe essere bisogno di convertire da stringa a "binario".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top