C++ 如何读取二进制C++;使用Python protobuf的protobuf数据?

C++ 如何读取二进制C++;使用Python protobuf的protobuf数据?,c++,python,protocol-buffers,C++,Python,Protocol Buffers,Google protobuf的Python版本只提供: SerializeAsString() 当C++版本给了我们两个: SerializeToArray(...) SerializeAsString() 我们以二进制格式写入我们的C++文件,我们希望保持这种方式。也就是说,有没有一种方法可以将二进制数据读入Python并像解析字符串一样对其进行解析 这是正确的做法吗 binary = get_binary_data() binary_size = get_binary_size()

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\u bar.ParseFromString(data)
行时,我得到以下错误:

Exception Type: DecodeError
Exception Value: Too many bytes when decoding varint.
更新2: 结果是,二进制数据上的填充将protobuf抛出;正如消息所示,发送的字节太多(在本例中,它指的是填充)

这个填充来自于在固定长度的缓冲区使用C++原始Bufff函数,<代码> SerialZigOtStudio。为了消除这种情况,我使用了以下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字符串可以包含任何字符,即它们能够直接保存“二进制”数据。应该不需要将字符串转换为“二进制”。

我不太确定您要对循环执行什么操作,但您将由此引发
TypeError
。将
None
分配给名称
string
,然后尝试向其添加一系列
int
s。在python中,字符串是字节序列,因此任何二进制数据在字符串中都应该是安全的。您能更清楚地解释一下,
SerializeAsString
对您的数据做了什么错误吗?对于Python 3来说,这不再是事实。