簡體   English   中英

如何使用字節在protobuf中存儲信息

[英]how bytes are used to store information in protobuf

我試圖了解協議緩沖區,這里是示例,我無法理解的是如何在后續消息中使用字節。 我不知道這個數字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與較高的編號相比,編碼所需的字節減少了一個字節,因此,為了進行優化,您可以決定將這些標簽用於常用或重復的元素,而將標簽16和更高的標簽用於較少使用的可選元素。

protobuf消息的一般形式是它是一系列形式的對:

  • 字段標題
  • 有效載荷

對於您的問題,我們可以在很大程度上忘記有效負載-這與1/2/3和<= 16限制沒有關系-所有這些都在字段標題中。 字段標頭是“ varint”編碼的整數; “ varint”使用最高有效位作為可選的延續位,因此較小的值(<= 127,假定為無符號而不是之字形)需要一個字節進行編碼-較大的值需要多個字節。 換句話說,在需要設置連續位(需要至少2個字節)之前,您將獲得7個有用的位。

然而! 字段標題本身由兩部分組成:

  • 線型
  • 字段編號/“標簽”

wire-type是前3位,表示有效載荷的基本格式-“長度分隔”,“ 64位”,“ 32位”,“ varint”,“ start-group”,“ end-組”。 這意味着在我們擁有的7個有用位中,只剩下4個; 4位足以編碼數字<=16。 就是為什么建議將最常見的元素的數字<= 16(作為優化)。

在您的問題中,1/2/3是字段號; 在編碼時,將其左移3,並由有效載荷的線型組成; 然后將這個組合值進行varint編碼。

Protobuf像從id(它們稱為標記的= 1,= 2)到實際值的映射一樣存儲消息。 與將數據更像具有固定偏移量的結構那樣傳輸數據相比,這將能夠更輕松地擴展它。 因此,例如,消息Point看起來會像這樣:

1 -> 100,
2 -> 500

然后將其解釋為x=100y=500label=not set 在較低的級別上,protobuf以高度緊湊的格式序列化此標簽-值映射,該格式除其他外,還使用可變長度編碼存儲整數。 您引用的段落僅在標記的情況下恰好突出了這一點,如果標記<16,則可以更緊湊地存儲,但是對於protobuf定義中的整數值來說,它也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM