Python3中的Google Protocol Buffers(protobuf) - ParseFromString(编码?)的麻烦

时间:2015-11-20 00:11:09

标签: python-3.x character-encoding protocol-buffers

我有80%的Google协议缓冲区在Python3中工作。我的.proto文件工作,我编码数据,生活几乎是好的。 问题是我不能将ParseFromString作为SerializeToString的结果。 当我打印SerializeToString时,它看起来像我期望的,一个相当紧凑的二进制表示(前面是b')。

我的猜测是,这可能与Python2和Python3处理字符串的方式不同。 SerializeToString的putput是Bytes,而不是字符串。

SerializeToString的打印输出(Python类型为):

b'\x10\xd7\xeb\x8e\xcd\x04\x1a\x0cnamegoeshere2@\x08\x80\xf8\xde\xc3\x9f\xb0\x81\x89\x14\x11\x00\x00\x00\x00\x00\x80d\xc0\x19\x00\x00\x00\x00\x00\xc0m@!\x00\x00\x00\x00\x00\x80R\xc0)\x00\x00\x00\x00\x00x\xb7\xc01\x00\x00\x00\x00\x00\x8c\x95@9\x00\x00\x00\x00\x00\x16\xb2@'

ParseFromString(消息)的结果:

None

没有提供错误......

所以 - 我最好的猜测是我需要做的就是.decode()生成的字节对象,问题是我不知道编码是什么。我尝试过UTF-8,-16,Latin-1和其他一些没有成功的人。我的Google-Fu很强大,但我没有找到任何相关内容。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:9)

ParseFromString是一种方法 - 它不会返回任何内容,而是使用已解析的内容填充self。使用它像:

message = MyMessageType()
message.ParseFromString(data)
print message.some_field