[英]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=100
, y=500
和label=not set
。 在較低的級別上,protobuf以高度緊湊的格式序列化此標簽-值映射,該格式除其他外,還使用可變長度編碼存儲整數。 您引用的段落僅在標記的情況下恰好突出了這一點,如果標記<16,則可以更緊湊地存儲,但是對於protobuf定義中的整數值來說,它也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.