踩到 Protobuf 解析坑了,如何才能严格解析 Protobuf?

2023-09-21 18:03:17 +08:00
 tool2d
解析是指 protobuf 二进制文件。这协议和 json 不一样,数据类型并不是 1 对 1 的。

比如一个 Length-delimited 类型,int 是 2 ,同时对应多个子类型。可以是嵌入式 messages ,可以是 utf8 文本字符串,也可以是纯 bytes 数组。

现在写了一个解析器,是什么类型,要纯粹靠猜。先尝试 utf8 ,不行再退回到嵌入式 messages ,解析一次。如果还是不行,就默认为 bytes 数组。

总觉得很不靠谱的样子,在没有 proto 辅助的前提下,如何才能优雅的转为 json?
2450 次点击
所在节点    程序员
22 条回复
ggvoking
2023-09-22 10:07:12 +08:00
建议先了解一下 protobuf 原理,类型本来就是固定的,要实现定义好,tlv 格式,读到 tag 就知道是对应的什么类型了。你想 pb 转 json 的话,首先要有数据文件,然后还需要
1. proto 生成的类自定义代码类文件,这样这个类包含 tag 和类型,然后走反射转 json 。
2. 有 proto 文件,可以不生成代码,可以直接走 proto 反射,golang 就有反射库[protoreflect]<https://github.com/jhump/protoreflect> ,其他语言自己找
isFire
2023-09-22 10:39:09 +08:00
难搞,之前做过动态解析 protobuf 格式数据的功能,方法可以参考一下,要解析最好还是先拿到 Message ,然后识别每个字段的顺序和类型,然后依次解析

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975959

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX