如何使用Python protobuf读取二进制C protobuf数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用Python protobuf读取二进制C protobuf数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1603字,纯文字阅读大概需要3分钟。
内容图文
![如何使用Python protobuf读取二进制C protobuf数据?](/upload/InfoBanner/zyjiaocheng/747/11909c7640b5458d8e95bd35f96038d4.jpg)
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 protobuf读取二进制C protobuf数据?全部内容,希望文章能够帮你解决如何使用Python protobuf读取二进制C protobuf数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。