c python通信protobuf_如何使用Python protobuf读取二进制C protobuf数据?

Python 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,c,protocol-buffers

来源: https://codeday.me/bug/20190726/1547170.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值