2

ここでプロトコル バッファを理解しようとしていますが、サンプルです。理解できないのは、次のメッセージでバイトがどのように使用されているかです。1 2 3この番号が何に使われているかわかりません 。

message Point {
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;
}

message Line {
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;
}

message Polyline {
  repeated Point point = 1;
  optional string label = 2;
}

Google protobuf で次の段落を読みましたが、ここで言われていることを理解できません。情報を保存するためにバイトがどのように使用されているかを理解するのに誰か助けてもらえますか?

各要素の「= 1」、「= 2」マーカーは、フィールドがバイナリ エンコーディングで使用する一意の「タグ」を識別します。タグ番号 1 ~ 15 は、より大きな番号よりもエンコードに 1 バイト少ない必要があるため、最適化として、一般的に使用される要素または繰り返される要素にこれらのタグを使用することを決定し、あまり一般的に使用されないオプションの要素にはタグ 16 以降を残すことができます。

4

2 に答える 2

4

protobuf メッセージの一般的な形式は、次の形式のペアのシーケンスです。

  • フィールド ヘッダー
  • ペイロード

あなたの質問については、ペイロードについてはほとんど忘れることができます - それは 1/2/3 および <=16 制限に関連するビットではありません - そのすべてはフィールド ヘッダーにあります。フィールド ヘッダーは「varint」でエンコードされた整数です。「varint」は最上位ビットをオプションの継続ビットとして使用するため、小さな値 (<=127、符号なしでジグザグではないことを前提) はエンコードに 1 バイトを必要とし、大きな値は複数のバイトを必要とします。つまり、継続ビットを設定する必要がある前に、少なくとも 2 バイトを必要とする 7 つの有用なビットを取得します。

でも!フィールド ヘッダー自体は、次の 2 つで構成されます。

  • ワイヤータイプ
  • フィールド番号/「タグ」

ワイヤ タイプは最初の 3 ビットであり、ペイロードの基本的な形式を示します - 「長さ区切り」、「64 ビット」、「32 ビット」、「varint」、「開始グループ」、「終了グループ"。つまり、7 つの有効なビットのうち、4 つだけが残っているということです。数値 <= 16 をエンコードするには 4 ビットで十分です。これが、最も一般的な要素に対してフィールド番号 <= 16 が (最適化として) 推奨される理由です。

あなたの質問では、1 / 2 / 3 はフィールド番号です。エンコード時に、これは 3 だけ左にシフトされ、ペイロードのワイヤ タイプで構成されます。次に、この構成された値は varint エンコードされます。

于 2013-09-07T21:35:32.933 に答える