google protocol buffer wire type 起始组和结束组用法
google protocol buffer wire type start group and end group usage
正在尝试解析来自服务器的消息,该服务器将有线类型传递为 Start Group 。
我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用线类型作为起始组,以便可以通过我自己解析消息
提前致谢
对于背景,"groups" 是表示子消息的不同方式。它们是这样声明的:
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 实现不支持组。 Google 有一些仍然使用组的非常古老的协议,但可能 Google 之外的任何人都不应该使用组,所以我猜你正在使用的协议是 Google的。 (如果没有,也许您的数据已损坏。)
我假设你已经读过 the encoding docs,但他们没有解释组。
组以 "start group" 标签开始编码,然后是子消息内容,然后是相应的 "end group" 标签。这是 protobufs 中标签出现在值末尾的唯一情况——在所有其他情况下,标签仅出现在开头。
相比之下,正常的子消息(如上面的第二个示例)使用 "length-delimited" 线类型进行编码:标记,后跟子消息大小,然后是内容。请注意长度分隔编码如何意味着您可以跳过子消息而不解析其所有字段;对于组,了解组结束位置的唯一方法是解析每个字段,直到看到结束组标记。
正在尝试解析来自服务器的消息,该服务器将有线类型传递为 Start Group 。 我正在使用 protobuf-c lib,其中不支持起始组和结束组(最新)。是否有任何示例如何使用线类型作为起始组,以便可以通过我自己解析消息
提前致谢
对于背景,"groups" 是表示子消息的不同方式。它们是这样声明的:
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 实现不支持组。 Google 有一些仍然使用组的非常古老的协议,但可能 Google 之外的任何人都不应该使用组,所以我猜你正在使用的协议是 Google的。 (如果没有,也许您的数据已损坏。)
我假设你已经读过 the encoding docs,但他们没有解释组。
组以 "start group" 标签开始编码,然后是子消息内容,然后是相应的 "end group" 标签。这是 protobufs 中标签出现在值末尾的唯一情况——在所有其他情况下,标签仅出现在开头。
相比之下,正常的子消息(如上面的第二个示例)使用 "length-delimited" 线类型进行编码:标记,后跟子消息大小,然后是内容。请注意长度分隔编码如何意味着您可以跳过子消息而不解析其所有字段;对于组,了解组结束位置的唯一方法是解析每个字段,直到看到结束组标记。