Pergunta

A versão Python do Google protobuf nos dá apenas:

SerializeAsString()

Onde como o C ++ versão nos dá tanto:

SerializeToArray(...)
SerializeAsString()

Estamos escrevendo para o nosso arquivo C ++ em formato binário, e gostaríamos de mantê-lo dessa maneira. Dito isto, há uma maneira de ler os dados binários em Python e analisá-lo como se fosse uma string?

É esta a maneira correta de fazê-lo?

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:

Aqui está um novo exemplo, e um 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 chegar à linha de foo_bar.ParseFromString(data), eu recebo este erro:

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

Update 2:

Acontece, que o preenchimento dos dados binários estava jogando protobuf off; muitos bytes estavam sendo enviados, como a mensagem sugere (neste caso, estava se referindo ao preenchimento).

Este estofamento vem do uso da função C ++ Protobuf, SerializeToArray em um tampão de comprimento fixo. Para eliminar esse, tenho usado 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)

Há uma falha de projeto aqui eu acho. I vai voltar a implementar meu código C ++ para que ele escreve matrizes de comprimento variável para o arquivo binário. Como recomendado pela documentação protobuf, vou prefixar cada mensagem com o seu tamanho do binário para que eu saiba o quanto de ler quando estou abrindo o arquivo com Python.

Foi útil?

Solução

I'm not an expert with Python, but you can pass the result of a file.read() operation into message.ParseFromString(...) without having to build a new string type or anything.

Outras dicas

Python strings can contain any character, i.e. they are capable of holding "binary" data directly. There should be no need to convert from string to "binary".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top