首页 文章

解码protobuf二进制 - 得到“无法解析输入”

提问于
浏览
0

我试图使用protoc解码protobuf二进制消息,我收到“无法解析输入”错误 . 我试过 protoc --decode_raw < proto.binprotoc --decode package.MessageType MySchema.proto < proto.bin .

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

  • 如何使用 protoc 工具解码原型二进制文件?

  • 该工具是否真的不能100%可靠地解码(即使我提供类型)或消息需要一些黑客才能被反序列化? (这引出了一个问题, protoc --decode 选项的目的是什么?

P.S:我正在使用protoc 3.6.1并且在Java程序中创建消息(syntax = proto2)

1 回答

  • 1

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

    但总的来说,是的,您需要在使用protoc解码之前去除长度前缀 . 没有关于如何将长度添加到protobuf消息的标准,有些使用 fixed32 前缀和其他 varint ,有些使用更长的标头 . 因此 protoc 工具无法解析长度 Headers .

    我还没有看到 protoc --decode 无法解码有效消息的任何情况 . 但它对错误的容忍度很小,例如截断数据 - 即使只有一个字段被破坏,它也总是拒绝整个消息 .

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

相关问题