日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

protobuf编码

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 protobuf编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

protobuf能夠跨平臺提供輕量的序列化和反序列化,得益于其平臺無關的編碼格式,本文就介紹下其中的編碼格式。

Varints

在protobuf中大量使用到了Varints的編碼格式,這是一個可變長度的編碼格式用于編碼整形數字。
Varint的最小單位是byte,即8位,每byte第一位(msb)是標志位用于標記是否還有后續byte。

===1=== 0000 0001 ===300=== 1010 1100 0000 0010

上面300的例子首先讀入第一個字節發現第一位為1,表示還有后續byte,然后讀取后一個byte,第一位為0就判斷已經讀完,然后組裝數值將其余位數取出0101100 0000010,然后反轉并拼接成為000 0010-010 1100,這樣就組成了300。

其他類型

負數,sint與int

在protobuf的定義中sint和int似乎看上去是重復的,但其實這兩種類型的底層編碼式不同的。這里以-3為例:
-3使用int編碼會變成FD FF FF FF FF FF FF FF FF 01,首先這也是varint編碼去掉每個byte的首位標志位然后反轉順序就成了FF FF FF FF FF FF FF FD是-3的補碼。
而使用sint編碼會變成05,貌似和-3沒有關系,其實它是-3經過一個zigzag轉換而得來的。

Signed OriginalEncoded As
00
-11
12
-23
21474836474294967294
-21474836484294967295

這樣轉換可以大大減少負數的表示長度,所以建議在經常出現負數的地方使用sint而不是int可以縮短編碼的大小。

非varient數值

對于double/fixed64,float/fixed32會分別使用固定的64位或32位進行表示。

不定長數據類型

對于string,byte等類型,就使用這種類型,首先使用一個varint表示長度,之后是數據的內容,列入字符串aaa就是03 61 61 61 其中03表示長度為3,61是a的utf8編碼。值得注意的是,嵌套的message類型、repeat字段也都是使用這種形式進行編碼到對象中的。

message編碼

有了上面這些在準備,我們可以進入真正的消息的編碼了。protobuf中每個字段都是根據定義的tag來進行定位的,在序列化的數據中,每個字段首先是一個Varint用于標記tag,其中最后三位使用來標志該字段的數據類型。

TypeMeaningUsed For
0Varintint32, int64, uint32, uint64, sint32, sint64, bool, enum
164-bitfixed64, sfixed64, double
2Length-delimitedstring, bytes, embedded messages, packed repeated fields
3Start groupgroups (deprecated)
4End groupgroups (deprecated)
532-bitfixed32, sfixed32, float

前面的位數用于標志tag,例如0000 1000,去掉第一個標志位后三個類型位,就表示tag為1的字段。
對于repeat類型由于歷史原因,proto2中默認是將數組元素并排排列在內的例如[1,2,3]會保存成[08 01 08 02 08 03]。后來對repeat類型進行了改進引入packed在定義的后面加上packed:

repeated int32 int = 1 [packed=true];

這樣序列化的數據就成了0A 03 01 02 03,其中0A表示使用不定長編碼,之后03表示長度,接下來是數據,就這個例子就能節約1byte。packed只適用于varint或固定長度數值表示的字段,對于string或者嵌套類型不適用,在proto3中支持的類型默認會使用packed。

實例

syntax = "proto2"; message Person {required string name=1;required int32 age=2;repeated Address add=3; } message Address{required string add=1; } ---實例--- name: "MyName" age: 18 add {add: "MyAdd1" } add {add: "MyAdd2" } ---Hex--- 0A 06 4D 79 4E 61 6D 65 10 12 1A 08 0A 06 4D 79 41 64 64 31 1A 08 0A 06 4D 79 41 64 64 32 ---解釋--- 0A //變長類型tag為1的字符串 06 //name字段6 byte長度 4D 79 4E 61 6D 65 //MyName 10 //varint編碼tag為2 12 //18 1A //變長類型tag為3 08 //Adress 8 byte長度 0A //變長類型tag為1 06 //add字段6 byte長度 4D 79 41 64 64 31 //MyAdd1 1A //變長類型tag為3 08 //Adress 8 byte長度 0A //變長類型tag為1 06 //add字段6 byte長度 4D 79 41 64 64 32 //MyAdd2

轉載于:https://www.cnblogs.com/resentment/p/6617787.html

總結

以上是生活随笔為你收集整理的protobuf编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产三级理论片 | 国产高清在线免费 | 涩涩涩在线视频 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 国产福利视频一区二区 | 色噜噜一区二区 | 中文字幕一二三四 | 50一60岁老妇女毛片 | 女女综合网 | 91视频国产免费 | 亚洲人吸女人奶水 | 免费看片网站91 | www.久久久.com | 婷婷综合久久 | 亚州中文字幕 | 中文视频在线 | www.午夜激情 | 又大又长粗又爽又黄少妇视频 | 欧美激情伊人 | 一本大道久久a久久精二百 琪琪色在线视频 | 欧美国产一二三区 | 凹凸福利视频 | 午夜免费网址 | 激情成人综合 | 国产最新在线 | 欧美一级片一区二区 | 国产字幕在线观看 | 无码人妻一区二区三区免费 | 麻豆免费在线观看视频 | 丰满少妇乱子伦精品看片 | 中文在线日韩 | 国产激情久久久久久熟女老人av | 国产视频一区二区视频 | 午夜青青草 | 超碰91在线观看 | 免费成人深夜夜 | 国产精品观看 | 91国产大片| 成人动作片 | 撕开少妇裙子猛然进入 | 免费视频爱爱太爽 | 啪啪一级片 | 国产一区二区三区高清视频 | 日韩精品伦理 | 国产资源在线视频 | 日本黄网站 | 日韩国产二区 | cao国产 | 色综合久久久久综合体桃花网 | 色呦呦免费| 黄色片免费在线 | 97夜色| 东北少妇不戴套对白第一次 | 99精品自拍| 一本视频 | 高清三区| 韩日av网站 | 欧美一区二区三区观看 | 国产av精国产传媒 | 蜜臀久久精品久久久久久酒店 | 亚洲一区二区三区91 | 韩国成人理伦片免费播放 | 人人澡人人澡人人澡 | 青青草久 | 国产精品你懂得 | 欧美黄色免费看 | 色屁屁www影院免费观看入口 | 日本人妻不卡一区二区三区中文字幕 | 黄色工厂在线观看 | 少妇精品久久久一区二区三区 | 看国产黄色片 | 色网站观看 | 国语粗话呻吟对白对白 | 亚洲字幕成人中文在线观看 | 亚洲一级Av无码毛片久久精品 | 色姐| 99riav3国产精品视频 | 美腿丝袜一区二区三区 | 欧美在线黄 | 中国一级特黄毛片大片 | 成人av资源网 | 黄色大片a级 | 久久无码视频网站 | 葵司有码中文字幕二三区 | 亚洲男男网站 | 看黄网站在线观看 | 日韩精品资源 | 亚洲中文在线一区 | 精品国产乱码久久久久久婷婷 | 啪啪免费视频网站 | 久久疯狂做爰流白浆xx | 在线观看欧美精品 | 快播日韩 | 欧洲亚洲一区二区三区 | 欧美成人免费一级 | 天堂中文字幕av | 亚洲一二三四在线 | 日本一区二区三区四区在线观看 | 亚洲国产精品国自产拍av |