c - google protocol buffer wire type 起始组和结束组用法

标签 c protocol-buffers protobuf-c

尝试解析来自服务器的消息,该消息将有线类型作为 Start Group 传递。 我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用有线类型作为起始组,以便我可以自己解析消息

提前致谢

最佳答案

对于背景,“组”是表示子消息的不同方式。它们是这样声明的:

message Foo {
  repeated group bar = 1 {
    optional int32 baz = 2;
    optional string qux = 3;
  }
}

在语义上,这几乎与以下内容完全相同:

message Foo {
  repeated Bar bar = 1;
  message Bar {
    optional int32 baz = 2;
    optional string qux = 3;
  }
}

但是,编码略有不同(如下所述)。

在 Protobuf 首次开源时,群组已被弃用,因此许多非 Google 实现不支持群组。谷歌有一些仍然使用组的非常古老的协议(protocol),但谷歌以外的人可能不应该使用组,所以我猜你正在使用的协议(protocol)是谷歌的协议(protocol)之一。 (如果没有,也许您的数据已损坏。)

我假设您已经阅读了 the encoding docs , 但他们不解释群体。

组以“开始组”标签开始编码,然后是子消息内容,然后是相应的“结束组”标签。这是 protobufs 中标 checkout 现在值末尾的唯一情况——在所有其他情况下,标签只出现在开头。

相比之下,正常的子消息(如上面的第二个示例中所示)使用“长度分隔”线类型进行编码:标记,后跟子消息大小,然后是内容。请注意长度分隔编码如何意味着您可以跳过子消息而不解析其所有字段;对于组,了解码结束位置的唯一方法是解析每个字段,直到看到结束组标记。

关于c - google protocol buffer wire type 起始组和结束组用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33815529/

相关文章:

c++ - 如何克服 Boost Spirit AST 困惑

protocol-buffers - google.protobuf.Empty 向后兼容是否危险?

java - 使用 ScalaPB 中的 Protocol Buffers 生成 Java 和 Scala 类

protocol-buffers - protobuffers 中的重复字段是否保持插入的顺序?

asp.net-core - Google.Protobuf 不允许属性为空

带有 wait(NULL) 的 C 程序没有像它应该的那样结束

python - 从 C 运行并行 python 脚本

c - 将挂载从子命名空间传播到父命名空间?

创建编译多个 C 文件以在 Minix 中使用的 Makefile

protocol-buffers - protobuf服务方法可以返回原始类型吗?