如何阅读使用Python protobuf的二进制C ++ protobuf的数据?
-
13-09-2019 - |
题
谷歌的protobuf的Python版本给我们唯一的:
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的脱落;字节太多正在发送中,作为消息显示(在此情况下,它指的是填充)。
此填充来自使用上的固定长度缓冲器中的C ++函数的protobuf,SerializeToArray
。为了消除这一点,我已经使用这个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 ++代码。诚如由protobuf的文档,我将与它的二进制文件的大小,这样我知道多少,当我打开该文件与Python阅读前缀的每一个消息。
解决方案
我不使用Python的专家,但你可以通过一个file.read()
操作到message.ParseFromString(...)
的结果,而无需建立一个新的字符串类型或任何东西。
其他提示
Python字符串可以包含任何字符,即,它们能够直接保持“二进制”的数据。不应该有任何需要从字符串转换为“二进制”。
不隶属于 StackOverflow