protocol-buffers - 解码 protobuf 二进制文件——得到“无法解析输入”
问题描述
我尝试使用 protoc 解码 protobuf 二进制消息,但出现“无法解析输入”错误。我都试过了protoc --decode_raw < proto.bin
和protoc --decode package.MessageType MySchema.proto < proto.bin
。
我在 SO 中阅读了两个线程,其中一个表明这protoc --decode
不是 100% 可靠的,另一个表明需要手动剥离开头的消息长度数据。我的问题是
- 如何使用
protoc
工具来解码原始二进制文件? - 该工具是否不能 100% 可靠地解码(即使我提供类型)或者消息需要一些黑客攻击才能反序列化?(这引出了一个问题,选项的目的是
protoc --decode
什么?
PS:我使用的是 protoc 3.6.1,消息是在 Java 程序中创建的(语法=proto2)
解决方案
如果您将您谈论的主题链接起来,那将会有所帮助。
但总的来说,是的,您需要在使用 protoc 解码之前去除长度前缀。关于如何为 protobuf 消息添加前缀长度没有标准,有些使用fixed32
前缀,有些使用varint
更长的标头。因此该protoc
工具无法解析长度标头。
而且我还没有看到任何protoc --decode
无法解码有效消息的情况。但它对错误的容忍度很小,例如截断数据 - 即使只有一个字段损坏,它也总是拒绝整个消息。
为了更好地调试,您可以使用例如这个工具,它逐字节解码并显示发生的第一个错误: https ://protogen.marcgravell.com/decode
推荐阅读
- excel - 如何使用或语句根据其他两列的条件从一列中提取唯一值?
- angular - 如何仅获得 Angular 6 rxjs 中的最后一个可观察输出
- android-fragments - 在 fragmentTransaction 中找不到 DialogFragment
- html - 即使宽度为 100%,HTML 标记也不会用 CSS 填充屏幕的宽度
- custom-object - 在更大的数据集上再次训练暗网
- javascript - 如何删除 iframe 生成的 DOM 中的额外空间?
- postman - 如何使用 Postman 发布带有图像的消息
- selenium - 如何清除远程 webdriver 会话上的本地存储
- azure - Azure Rate Card API JSON 响应没有虚拟机的内存和 CPU 指标
- c# - 如何从图标弹出的日历中将选定的日期放入文本框中?