色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Google二進制編解碼技術之Protobuf 3

jf_78858299 ? 來源:碼農的荒島求生 ? 作者:陸小風 ? 2023-02-15 14:29 ? 次閱讀
字段名稱與字段類型

對于任何一個有用的信息都包含這樣幾部分:

  • 字段名稱
  • 字段類型
  • 字段值

就像C/C++中定義變量時:

int i = 100;

在這里,字段名稱就是i,字段類型是int,字段值是100。

剛才我們用varint以及ZigZag編碼解決了字段值表示的問題,那么該怎樣表示字段名稱和字段類型呢?

首先,對于字段類型還比較簡單,因為字段類型就那么多,protobuf中定義了6種字段類型:

圖片

對于6種字段類型我們使用3個比特位來表示就足夠了。

接下來比較有趣的是字段名稱該怎么表示呢?假設我們需要傳遞這樣一個字段:

int long_long_name = 100;

那么我們真的需要把“long_long_name”這么多字符通過網絡傳遞給對端嗎?

既然通信雙方需要協議,那么“long_long_name”這字段其實是client和server都知道的,它們唯一不知道的就是“ 哪些值屬于哪些字段 ”。

為解決這個問題, 我們給每個字段都進行編號 ,比如通信雙方都知道“long_long_name”這個字段的編號是2,那么對于:

int long_long_name = 100;

這個信息我們只需要傳遞:

  • 字段名稱:2 (2對應字段“long_long_name”)
  • 字段類型:0 (0表示varint類型,參見上圖)
  • 字段值:100

所以我們可以看到, 無論你用多么復雜的字段名稱也不會影響編碼后占據的空間,字段名稱根本就不會出現在編碼后的信息中, so clever。

從宏觀上看

我們已經在protobuf中看到了數字以及字段名稱以及字段類型是怎么表示了,現在是時候從宏觀角度來看看多個字段該怎么編碼了。

從本質上講,protobuf被編碼后形成一系列的key-value,每個key-value對應一個proto中的字段。

也就是鍵值對:

圖片

其中value比較簡單,也就是字段值;而字段名稱和字段類型會被拼接成key,protobuf中共有6種類型,因此只需要3個比特位即可;字段名稱只需要存儲對應的編號,這樣可以就可以這樣編碼:

(字段編號 << 3) | 字段類型

假設server接收到了一個key為0x08,其二進制的表示為:

0000 1000

由于key也是利用varint編碼的,因此需要將第一個比特位去掉,這樣我的得到:

000 1000

根據key的編碼方式,其后三個比特位表示字段類型,即:

000

也就是0,這樣我們知道該key的類型是Varint(第0號類型),而字段編號為抹掉后3個比特位的值,即:

0001

這樣,我們就知道了該key對應的字段編號為1,得到編號我們就能根據編號找到對應的編號名稱。

嵌套數據

與Json和XML類似,protobuf中也支持嵌套消息,就像這樣:

message SubMsg {
  optional int32 id = 1;
}
message Msg {
  optional SubMsg msg = 1;
}

其實現也比較簡單,這依然遵循被編碼后形成一系列的key-value,只不過對于嵌套類型的key來說,其value是由子消息的key-value組成。

圖片

protobuf與編譯語言

與Json一樣,protobuf也是一門語言,兼具了文本的可讀性以及二進制的高效。

protobuf之所以能做到這一點就好比C語言與機器指令。

C語言是給程序員看的,可讀性好,而機器指令是給硬件使用的,性能好,編譯器會將C語言程序轉為機器可執行的機器指令。

而protobuf也一樣,protobuf也是一門語言,會將可讀性較好的消息編碼為二進制從而可以在網絡中進行傳播,而對端也可以將其解碼回來。

在這里protobuf中定義的消息就好比C語言,編碼后的二進制消息就好比機器指令。

而protobuf作為事實上語言必然有自己的語法,其語法就是這樣:

圖片

怎么樣,還覺得編譯原理沒什么用嗎?

不理解編譯原理是不可能發明protobuf這種技術的。

總結

我在寫這篇文章時不斷感嘆,Google的這項技術節省了多少程序員的時間,同時我們也能看到這種基石般的技術依賴的底層原理卻非常古老:

  • 信息的編解碼
  • 編譯原理

怎么樣,這些是不是遠遠沒有IT界各種流行的技術聽上去時髦有趣,而正是這種樸素的技術支撐起了工業界,現在你也應該能明白底層技術的重要性了吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    7520

    瀏覽量

    88231
  • Server
    +關注

    關注

    0

    文章

    91

    瀏覽量

    24054
  • 網絡編程
    +關注

    關注

    0

    文章

    72

    瀏覽量

    10086
收藏 人收藏

    評論

    相關推薦

    探討2對4二進制解碼器及4到16二進制解碼器配置

    為等效代碼。 二進制解碼器是另一種類型的數字邏輯設備,根據數據輸入線的數量,其輸入的2位,3位或4位代碼,因此具有一組2位或更多位的解碼器將定義為具有n位代碼,因此將有可能表示2 n個
    的頭像 發表于 12-29 12:10 ?1.1w次閱讀
    探討2對4<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器及4到16<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器配置

    二進制相對調相(二進制差分調相2DPSK)的工作原理

    二進制相對調相(二進制差分調相2DPSK)的工作原理
    發表于 10-21 13:01 ?3210次閱讀
    <b class='flag-5'>二進制</b>相對調相(<b class='flag-5'>二進制</b>差分調相2DPSK)的工作原理

    二進制

    二進制   二進制與十進制的區別在于數碼的個數和進位規律有很大的區別,顧名思義,二進制的計數規律為逢二進一,是以2為基數的計數體制。10這
    發表于 04-06 23:48 ?8210次閱讀
    <b class='flag-5'>二進制</b>

    二進制時鐘電路

    二進制時鐘電路
    發表于 09-11 11:22 ?3127次閱讀
    <b class='flag-5'>二進制</b>時鐘電路

    二進制編碼和二進制數據

    二進制編碼和二進制數據   二進制編碼是計算機內使用最多的碼制,它只使用兩個基本符號"0"和"1",并且通過由這兩個符號組成的
    發表于 10-13 16:22 ?4808次閱讀

    什么是二進制計數器,二進制計數器原理是什么?

    什么是二進制計數器,二進制計數器原理是什么? 計數器是數字系統中用得較多的基本邏輯器件。它不僅能記錄輸入時鐘脈沖的個數,還可以實現
    發表于 03-08 13:16 ?3.1w次閱讀

    二進制電平,什么是二進制電平

    二進制電平,什么是二進制電平 在二進制數字通信系統中,每個碼元或每個符號只能是“1”和“0”兩個狀態之一。若將每個碼元可能取的狀態增
    發表于 03-17 16:51 ?2365次閱讀

    二進制加法程序【匯編版】

    二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】二進制加法程序【匯編版】
    發表于 12-29 11:02 ?0次下載

    二進制加法程序【C語言版】

    二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】二進制加法程序【C語言版】
    發表于 12-29 11:03 ?0次下載

    3二進制計數器

    基于VHDL的EDA實驗---3二進制計數器
    發表于 11-08 17:45 ?1次下載

    基于軟件二進制代碼重用技術綜述

    在當前的計算機系統架構和軟件生態環境下,ROP(return-oriented programming)等基于二進制代碼重用的攻擊技術被廣泛用于內存漏洞利用.近年來。網絡空間安全形勢愈加嚴峻。學術界
    發表于 12-26 15:31 ?0次下載
    基于軟件<b class='flag-5'>二進制</b>代碼重用<b class='flag-5'>技術</b>綜述

    二進制解碼器案例說明

    二進制解碼器是另一種由各個邏輯門構成的組合邏輯電路,與編碼器完全相反。
    的頭像 發表于 06-22 09:41 ?9402次閱讀
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器案例說明

    二進制解碼器到底是什么

    二進制解碼器是由單獨的邏輯門構成的另一種組合邏輯電路,與編碼器完全相反。名稱“解碼器”是指將編碼信息從一種格式轉換或解碼為另一種格式,因此二進制
    發表于 01-03 17:42 ?6260次閱讀
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器到底是什么

    二進制解碼器開源設計

    電子發燒友網站提供《二進制解碼器開源設計.zip》資料免費下載
    發表于 06-16 15:01 ?0次下載
    <b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器開源設計

    二進制編碼器工作原理 如何選擇二進制編碼器

    二進制編碼器是一種數字電路,它將輸入的二進制代碼轉換為對應的輸出信號。在數字系統中,編碼器用于將數據從一種形式轉換為另一種形式,以便于處理和傳輸。 二進制編碼器工作原理 輸入與輸出關系 :
    的頭像 發表于 11-06 09:44 ?967次閱讀
    主站蜘蛛池模板: 国产AV电影区二区三区曰曰骚网| 蜜芽在线播放免费人成日韩视频| 久久99免费视频| 久久看片网| 色综合伊人色综合网站| 一个人免费观看完整视频日本| 糙汉顶弄抽插HHHH| 精品久久久久久久国产潘金莲| 男女爽爽无遮挡午夜视频在线观看| 色翁荡熄月月| 97综合久久| 精品国产免费第一区二区| 秋霞伦理手机在线看片| 伊人yinren6综合网色狠狠| 成人在线观看播放| 麻豆一二三区果冻| 亚洲欧美精品一中文字幕| 多人乱肉高hnp| 男人J放进女人P全黄网站| 亚洲成A人片在线观看中文不卡 | 国模啪啪久久久久久久| 清冷受被CAO的合不拢| 1000部做羞羞事禁片免费视频网站| 国产精品成人影院| 欧美性爱 先锋影音| 中文字幕本庄优花喂奶| 国产日韩欧美另类| 色老头色老太aaabbb| MD传媒MD0021在线观看| 老师你下面好紧夹死了| 亚洲永久在线观看| 国产在线午夜| 亚洲、国产综合视频| 国产成人女人视频在线观看| 琪琪的色原网站| jiucao在线观看精品| 男生jj插入女生jj| 97人妻碰视频在线观看| 就去色一色| 最新国自产拍天天更新| 久久这里只精品热在线18|