解码protobuf二进制文件-出现“无法解析输入”

时间:2018-09-27 22:00:25

标签: protocol-buffers

我尝试使用protoc解码protobuf二进制消息,但出现“ 解析输入失败”错误。我同时尝试了protoc --decode_raw < proto.binprotoc --decode package.MessageType MySchema.proto < proto.bin

我在SO中阅读了两个线程,其中一个表明protoc --decode不是100%可靠的,而另一个则表明开头的消息长度数据需要手动剥离。我的问题是

  • 如何使用protoc工具解码原始二进制文件?
  • 是不是该工具不能百分百可靠(即使我提供类型)也无法解码,或者消息需要进行一些修改才能反序列化? (这引出了一个问题,protoc --decode选项的目的是什么?

P.S:我正在使用协议3.6.1,并且消息是在Java程序中创建的(语法= proto2)

1 个答案:

答案 0 :(得分:1)

如果您链接了您所讨论的主题,那将会有所帮助。

但是,通常,是的,在使用protoc解码之前,您需要去除长度前缀。对于如何为protobuf消息加上前缀没有标准,有些使用fixed32前缀,另一些使用varint,有些具有更长的标头。因此protoc工具无法解析长度标头。

而且我还没有看到protoc --decode不会解码有效消息的任何情况。但是它对错误(例如数据被截断)的容忍度很小-即使只有一个字段被破坏,它也始终拒绝整个消息。

为了进行更好的调试,您可以使用例如此工具逐字节解码并显示发生的第一个错误: https://protogen.marcgravell.com/decode