当前位置: 首页 > 知识库问答 >
问题:

在不知道原始编码消息的类型的情况下解组它[重复]

云伯寅
2023-03-14

我想将[]byte带入原型。事先不知道它是什么类型的消息。

为了添加更多细节,我知道编码类型/消息可以是的类型集。(它们都是在我自己的proto文件中声明并内置到Go二进制文件中的类型。)

我想看看是否有可能获取一个字节数组并从中重建原始消息。

我写了这个演示:https://play.golang.org/p/WF9KpTlZnp7如果我传递描述符,我可以将其解码为Dynamicpb,并从任何返回消息。

共有1个答案

羊柏
2023-03-14

协议缓冲区连线格式不是自描述的。这意味着关于协议缓冲区类型的信息不会与消息本身一起编码。这就是为什么在解组期间,必须提供类型。

在网络上,protobuf格式非常简单。基本上,只对字段号(注意不是名称,只对数字)和值(序列化为字节)进行编码。

动态解码消息有两种策略。

一种是使用任何

https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto

要使消息能够使用any包进行解码,必须首先使用any包对其进行编码,并且必须在解码和编码原型注册表中注册类型。这是因为,any只需对底层消息进行编码,然后将其放入具有引用该类型的字符串的消息中即可实现。通常,这被称为信封,因为与信件一样,原始消息也是用附加上下文(消息的类型)包装的。

如果您可以同时控制编码和解码,则此策略效果最好。如果可能的话,这将是推荐的策略。

另一种策略是使用Dynamicpb并尝试解析未知字段。这是因为从proto 3.5开始,添加了未知字段。如果原始消息被反序列化但原始类型不知道该字段,则剩余的字段将被推入未知字段。类型信息和字段名称不会在消息类型中传递。因此这些字段将显示为具有未知名称和类型的未知字段。

例如,如果您的消息不同,但共享的字段具有描述该类型的相同编号和类型,则可以使用该字段首先反序列化该字段,然后在打开第一个字段中已知的信息后反序列化其余字段。

对于不控制编码路径的系统来说,这更多是一种变通方法,并且不是推荐的策略。

 类似资料:
  • 问题内容: 我正在使用gob将结构序列化到磁盘。有问题的结构包含一个接口字段,因此具体类型需要使用进行注册。 这里的难题是,进行灌装的图书馆应忽略所使用的混凝土类型。我希望即使调用者定义了自己的接口实现,也可以进行序列化。 我可以通过动态注册类型来成功编码数据(请参见下面的简单示例),但是在尝试重新读取数据时,gob拒绝接受未注册的类型。它令人沮丧,因为感觉好像所有数据都在那里- 如果gob 标记

  • 我使用键值存储作为我的Go语言应用程序的后端,日期作为键(保持条目排序),json文档作为值。json的顶级命名空间()以及和存在于我存储的每个json文档中,但在其他方面存在一些差异(尤其是关于一些嵌套的json数据),所以当keyI从数据库中提取时,我真的不知道我在循环浏览的任何时间提取了什么。这是json数据的示例 当我从数据库中提取数据时,我要做的第一件事是将每个条目解组到<code>ma

  • 我想知道如何编译。不知道公共类名的java文件。 提供一个示例用例:我正在操作一个沙盒,允许用户向我发送一个字符串。我将该字符串写入。我编译的java文件评估生成的类并回复输出。 ?????.Java语言 如果我随机分配?????。java是一个名称,例如test。java并运行命令javac测试。那么它就会失败 错误:类HelloWorld是公共的,应该在名为HelloW的文件中声明orld.j

  • 本文向大家介绍MySQL在不知道列名情况下的注入详解,包括了MySQL在不知道列名情况下的注入详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近感觉脑子空空,全在为了刷洞去挖洞,还是回归技术的本身让自己舒服些。好了,下面话不多说了,来一起看看详细的介绍吧 前提 以下情况适用于 MySQL < 5版本,或者在 MySQL >= 5 的版本[存在information_schema库],且已获取

  • 问题内容: 我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。 例如,一个执行可能具有这样的JSON字符串: 另一个像这样: 如何遍历各种JSON元素并确定键及其值?我看着的。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。 例如: 或其他库(或)中是否有一个

  • 我知道协议缓冲区是一种序列化格式,需要中的消息格式。proto,以便正确读回。但我有一个文件,我不知道正确的消息格式,因为它没有发布。我想做的是自己对数据进行反向工程,这样我就可以重建消息。为此,我需要读取原始文件,从中可以提取字段编号、类型和值。 有没有一个程序可以做到这一点(最好是在python中,但C/C也很酷)?