谷歌协议缓冲线类型启动组和结束组使用情况

时间:2015-11-19 22:27:53

标签: c protocol-buffers protobuf-c

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

提前致谢

1 个答案:

答案 0 :(得分:4)

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

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实施都不支持群组。谷歌有一些非常古老的协议,仍然使用群组,但可能没有人在谷歌之外应该使用群组,所以我猜你正在使用的协议是谷歌的协议之一。 (如果没有,也许你只是有损坏的数据。)

我假设您已经阅读the encoding docs,但他们没有解释群组。

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

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