【问题标题】:Google Protocol Buffers (protobuf) in Python3 - trouble with ParseFromString (encoding?)Python3 中的 Google 协议缓冲区(protobuf)- ParseFromString 的问题(编码?)
【发布时间】:2015-11-20 00:11:09
【问题描述】:

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

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

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(message) 的结果:

None

没有提供错误...

所以 - 我最好的猜测是我需要做的就是 .decode() 生成的字节对象,问题是我不知道编码是什么。我尝试了 UTF-8、-16、Latin-1 和其他一些但没有成功。我的 Google-Fu 很强大,但我在这方面没有发现任何东西。

任何帮助将不胜感激。

【问题讨论】:

  • 显示调用 ParseFromString 的代码

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


【解决方案1】:

ParseFromString 是一个方法——它不返回任何东西,而是用解析的内容填充self。像这样使用它:

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

【讨论】:

  • 有没有办法检查ParseFromString 是否成功?它会抛出异常吗?
  • @pooya13 我相信如果消息完全无法解析,它会抛出异常。但是,请记住,通常任何有效的 Protobuf 都可以成功解析为 any 类型,因为底层格式不包含类型信息。所以如果你解析为错误的类型,你不一定会得到一个解析错误——你只会得到垃圾内容。
  • 如果我们有大量的字符串数据如何处理这种情况,在此先感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2017-03-18
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多