在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Google二進制編解碼技術(shù)之Protobuf 2

jf_78858299 ? 來源: 碼農(nóng)的荒島求生 ? 作者:陸小風(fēng) ? 2023-02-15 14:28 ? 次閱讀
protobuf是怎樣實現(xiàn)的?

首先,我們來思考最簡單的情況,該怎樣表示數(shù)字。

你可能會想這還不簡單,統(tǒng)一用固定長度,比如用64個比特(8字節(jié)),這種方法可行,但問題是不論一個數(shù)字有多小,比方2,那么用這種方法表示2也需要占據(jù)64個比特(8字節(jié)):圖片

明明只要一個字節(jié)就能表示而我們卻用了8個,前面的全都是0,這也太奢侈太浪費了吧。

顯然,在這里我們不能使用固定長度來表示數(shù)字,而需要使用變長方法來表示。

什么叫變長?意思是說如果數(shù)字本身比較大,那么其使用的比特位可以較多,但如果數(shù)字很小那么就應(yīng)該使用較少的比特位來表示,這就叫變長,隨機應(yīng)變,不死板。

那怎樣變長呢?

我們規(guī)定:對于每一個字節(jié)來說,第一個比特位如果是1那么表示接下來的一個比特依然要用來解釋為一個數(shù)字,如果第一個比特為0,那么說明接下來的一個字節(jié)不是用來表示該數(shù)字的。

也就是說對于每個8個比特(1字節(jié))來說,它的有效載荷是7個比特,第一個比特僅僅用來標(biāo)記是否還應(yīng)該把接下來的一個字節(jié)解析為數(shù)字。

根據(jù)這個規(guī)定假設(shè)來了這樣一串01二進制:

1010110000000010

根據(jù)規(guī)定,我們首先取出第一個字節(jié),也就是:

10101100

此時我們發(fā)現(xiàn)第一個比特位是1,因此我們知道接下來的一個字節(jié)也屬于該數(shù)字,將當(dāng)前字節(jié)的1去掉就是:

0101100

然后我們看下一個字節(jié):

00000010

我們發(fā)現(xiàn)第一個bit為0,因此我們知道下一個字節(jié)不屬于該數(shù)字了。

接下來我們將解析到的0101100(第一個字節(jié)去掉第一個比特位)以及第二個字節(jié)0000010(第二個字節(jié)去掉第一個比特位)翻轉(zhuǎn)之后拼接到一起,這里之所以翻轉(zhuǎn)是因為我們規(guī)定數(shù)字的高位在后。

這個過程就是:

1010110000000010  
->  10101100 | 00000010 // 解析得到兩個字節(jié)
    _          _
 
->  0101100  |  0000010  // 各自去掉最高位 
->  0000010  |  0101100  // 兩個字節(jié)翻轉(zhuǎn)順序

    0000010  +  0101100
->  100101100           // 拼接

最后我們得到了100101100,這一串二進制表示數(shù)字300。

這種數(shù)字的變長表示方法在protobuf中被稱之為varint。

因此在這種表示方法下,如果數(shù)字較大,那么使用的比特就多,如果數(shù)字較小那么使用比特就少,聰明吧。

有的同學(xué)看到這里可能會問題,剛才講解的方法只能表示無符號數(shù)字,那么有符號數(shù)字該怎么表示呢?比如-2該怎么表示?

有符號數(shù)的表示

按照剛才變長編碼的思想,-2147483646使用的比特位應(yīng)該比-2要少。

然而我們知道在計算機世界中負(fù)數(shù)使用補碼表示的,也就是說最高位(最左側(cè)的比特位)一定是1,假設(shè)我們使用64位來表示數(shù)字,那么如果我們依然用補碼來表示數(shù)字的話那么無論這個負(fù)數(shù)有多大還是多小都需要占據(jù)10個字節(jié)的空間。

為什么是10個字節(jié)呢?

不要忘了varint每個字節(jié)的有效負(fù)荷是7個比特,那么對于需要64位表示的數(shù)字來說就需要64/7向上取整也就是10個字節(jié)來表示。

這顯然不能滿足我們對數(shù)字變長存儲的要求。

該怎么解決這個問題呢?

既然無符號數(shù)字可以方便的進行變長編碼,那么我們將有符號數(shù)字映射稱為無符號數(shù)字不就可以了 ,這就是所謂的ZigZag編碼,是不是很聰明,就像這樣:

原始信息      編碼后
0            0 
-1           1 
1            2
-2           3
2            4
-3           5
3            6

...          ...

2147483647   4294967294
-2147483648  4294967295

這樣我們就可以將有符號數(shù)字轉(zhuǎn)為無符號數(shù)字,接收方接收到該數(shù)據(jù)后再恢復(fù)出有符號數(shù)字。

現(xiàn)在數(shù)字的問題徹底解決了,但這僅僅是萬里長征第一步。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7519

    瀏覽量

    88216
  • Server
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    24054
  • 網(wǎng)絡(luò)編程
    +關(guān)注

    關(guān)注

    0

    文章

    72

    瀏覽量

    10085
收藏 人收藏

    評論

    相關(guān)推薦

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

    二進制解碼器是由單獨的邏輯門構(gòu)成的另一種組合邏輯電路,與編碼器完全相反。名稱“解碼器”是指將編碼信息從一種格式轉(zhuǎn)換或解碼為另一種格式,因此二進制
    的頭像 發(fā)表于 12-29 12:10 ?1.1w次閱讀
    探討<b class='flag-5'>2</b>對4<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器及4到16<b class='flag-5'>二進制</b><b class='flag-5'>解碼</b>器配置

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

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

    二進制

    二進制   二進制與十進制的區(qū)別在于數(shù)碼的個數(shù)和進位規(guī)律有很大的區(qū)別,顧名思義,二進制的計數(shù)規(guī)律為逢二進一,是以
    發(fā)表于 04-06 23:48 ?8210次閱讀
    <b class='flag-5'>二進制</b>

    二進制編碼和二進制數(shù)據(jù)

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

    什么是二進制計數(shù)器,二進制計數(shù)器原理是什么?

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

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

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

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

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

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

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

    二進制數(shù)據(jù)壓縮算法

    二進制數(shù)據(jù)壓縮算法二進制是計算技術(shù)中廣泛采用的一種數(shù)制。二進制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù)。它的基數(shù)為2,進位規(guī)則是“逢
    的頭像 發(fā)表于 02-28 09:31 ?2w次閱讀

    二進制編碼的十進制表示轉(zhuǎn)換解碼

    二進制編碼小數(shù)的主要優(yōu)點是它允許在decimal(base-10)和binary(base-2)表單之間輕松轉(zhuǎn)換。但是,缺點是BCD代碼是浪費的,因為不使用 1010 (十進制10)和 1111 (十
    的頭像 發(fā)表于 06-24 09:31 ?1.4w次閱讀
    <b class='flag-5'>二進制</b>編碼的十<b class='flag-5'>進制</b>表示轉(zhuǎn)換<b class='flag-5'>解碼</b>器

    二進制如何轉(zhuǎn)換為十進制?

    二進制轉(zhuǎn)換為十進制(base-2到base-10) )數(shù)字和背面是一個重要的概念,因為二進制編號系統(tǒng)構(gòu)成了所有計算機和數(shù)字系統(tǒng)的基礎(chǔ)。
    的頭像 發(fā)表于 06-22 10:21 ?2.4w次閱讀

    二進制解碼器案例說明

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

    二進制解碼器到底是什么

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

    二進制解碼器開源設(shè)計

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

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

    編碼器通常有多個輸入端(通常為2的n次方個,其中n是編碼器的位數(shù)),和一個或多個輸出端。每個輸入端對應(yīng)一個二進制位,而輸出端則表示輸入的二進制值。 優(yōu)先編碼器 : 優(yōu)先編碼器是一種特殊的二進制
    的頭像 發(fā)表于 11-06 09:44 ?955次閱讀
    主站蜘蛛池模板: 免费看黄在线| 欧美黄免在线播放| 午夜精品视频在线观看美女| 伊人狼人综合| 天天干天天综合| 国内久久精品| 性欧美hd| 美女扒开尿口让男人桶| 樱桃磁力bt天堂| 特一级毛片| 欧美激欧美啪啪片免费看| 激情五月婷婷丁香| www在线视频在线播放| 五月天狠狠操| 国产精品久久久久久久免费大片| 啪啪小视频网站| 末发育女一区二区三区| 亚洲图片欧美色图| 日韩美女拍拍免费视频网站| 久久综合色综合| avtt国产| 精品亚洲午夜久久久久| susu成人影院| 伊人成伊人成综合网2222| 日韩视频高清| 高清配种视频xxxxx| 日本黄色免费网址| 欧美另类高清| 曰本又色又爽又黄三级视频| 日韩欧美在线中文字幕| 久久lu| 午夜毛片视频| 日本sese| 亚洲合集综合久久性色| 免费观看a毛片一区二区不卡| 99精品视频免费| 国产伦精品一区二区三区免费| 性猛交╳xxx乱大交| 四虎影视在线影院4hu| 国产一级特黄特色aa毛片| 手机看片1024久久|