Как я могу прочитать двоичные данные C ++ protobuf, используя Python protobuf? - PullRequest
3 голосов
/ 07 декабря 2009

Python-версия Google protobuf дает нам только:

SerializeAsString()

Где версия C ++ дает нам оба:

SerializeToArray(...)
SerializeAsString()

Мы пишем в наш файл C ++ в двоичном формате, и мы хотели бы сохранить его таким образом. Тем не менее, есть ли способ чтения двоичных данных в Python и анализа их, как если бы это была строка?

Это правильный способ сделать это?

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)

Обновление:

Вот новый пример и проблема:

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)

Когда мы добираемся до строки foo_bar.ParseFromString(data), я получаю эту ошибку:

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

Обновление 2:

Оказывается, заполнение двоичных данных сбрасывало protobuf; как указывалось в сообщении, было отправлено слишком много байтов (в данном случае это было связано с заполнением).

Это заполнение происходит из-за использования функции protobuf в C ++, SerializeToArray в буфере фиксированной длины. Чтобы устранить это, я использовал этот временный код:

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 ++, чтобы он записывал массивы переменной длины в двоичный файл. Как указано в документации к protobuf, я буду добавлять к каждому сообщению префикс двоичного размера, чтобы знать, сколько читать, когда открываю файл с помощью Python.

Ответы [ 2 ]

4 голосов
/ 07 декабря 2009

Строки Python могут содержать любой символ, т. Е. Они способны напрямую содержать «двоичные» данные. Не должно быть необходимости преобразовывать строку в «двоичный».

4 голосов
/ 07 декабря 2009

Я не эксперт по Python, но вы можете передать результат операции file.read() в message.ParseFromString(...) без необходимости создания нового строкового типа или чего-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...