Come faccio a leggere i dati binari C ++ protobuf utilizzando Python protobuf?
-
13-09-2019 - |
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.
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".