谷歌的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字符串可以包含任何字符,即,它们能够直接保持“二进制”的数据。不应该有任何需要从字符串转换为“二进制”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top