Google 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;正如消息所暗示的那样,发送了太多字节(在这种情况下,它指的是填充)。
此填充来自SerializeToArray
在固定长度缓冲区上使用 C++ protobuf 函数。为了消除这种情况,我使用了这个临时代码:
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 打开文件时要读取多少内容。