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.