3

ワイヤ タイプを Start Group として渡すサーバーからのメッセージを解析しようとしています。開始グループと終了グループがサポートされていない (最新の) protobuf-c lib を使用しています。

前もって感謝します

4

1 に答える 1

7

背景として、「グループ」はサブメッセージを表す別の方法です。それらは次のように宣言されます。

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 のプロトコルの 1 つだと思います。(そうでない場合は、データが破損している可能性があります。)

既にエンコーディング ドキュメントを読んでいると仮定しますが、グループについては説明していません。

グループは、「開始グループ」タグで始まり、サブメッセージの内容が続き、その後に対応する「終了グループ」タグが続くようにエンコードされます。これは、protobufs で値の末尾にタグが表示される唯一のケースです。他のすべてのケースでは、タグは先頭にのみ表示されます。

対照的に、通常のサブメッセージ (上記の 2 番目の例のように) は、「長さで区切られた」ワイヤ タイプを使用してエンコードされます: タグ、サブメッセージ サイズ、コンテンツが続きます。長さで区切られたエンコーディングは、すべてのフィールドを解析せずにサブメッセージをスキップできることを意味することに注意してください。グループの場合、グループの終了位置を知る唯一の方法は、end-group タグが表示されるまですべてのフィールドを解析することです。

于 2015-11-20T07:42:42.757 に答える