protobuf序列化出來的二進位制訊息特別的緊湊,得益於使用巧妙的編碼格式。
1、varint
varint 是一種緊湊的表示數字的方法。它用乙個或多個位元組來表示乙個數字,值越小的數字使用越少的位元組數。varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位為 1,表示後續的 byte 也是該數字的一部分,如果該位為 0,則結束。其他的 7 個 bit 都用來表示數字。
因此小於 128 的數字都可以用乙個 byte 表示。大於 128 的數字,比如 300,會用兩個位元組來表示:1010 1100 0000 0010
2、key_value
google protocol buffer 位元組序採用 little-endian 的方式,訊息經過序列化後會成為乙個二進位制資料流,該流中的資料為一系列的 key-value 對,每個欄位由字段頭(key)和字段體(value)組
key 的定義如下: (field_number << 3) | wire_type
3、zigzag編碼
sint32採用zigzag編碼
zigzag編碼:採用無符號數來表示有符號數字,正數和負數交錯
4、例子
300 時編碼如下
08 ac 02 -- 記憶體中資料
08: 1 << 3 | 0
ac 02 -- 轉換成二進位制
1010 1100 0000 0010
010 1100 0000 0010
1 0010 1100
300
Protobuf協議格式詳解
protobuf 是google開源的乙個序列化框架,類似xml,json,最大的特點是基於二進位制,比傳統的xml表示同樣一段內容要短小得多。還可以定義一些可選字段,用於服務端與客戶端通訊。前面幾篇文章說了protobuf的用法,看到網上也沒有分析protobuf協議的文章,就利用一些時間寫了 p...
使用protobuf作為http通訊格式
protobuf谷歌的開源序列化專案,類似的還有於json,xml等組織格式 據說protobuf的序列化占用的資料量最下,傳輸效率最高,並且作為伺服器開發者,只需要掌握.proto檔案的書寫方式,就可以生成不同語言的序列化物件。這次講解一下如何在伺服器和安卓客戶端之間利用protobuf傳輸資料。...
protobuf中資料格式與型別
訊息格式 訊息由至少乙個字段組合而成,類似於c語言中的結構體,每個欄位都有一定的格式 資料型別 欄位名稱 唯一的編號標籤值 欄位名稱 protobuf建議以下劃線命名而非駝峰式 唯一的編號標籤 代表每個欄位的乙個唯一的編號標籤,在同乙個訊息裡不可以重複。這些編號標籤用與在訊息二進位制格式中標識你的字...