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

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

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

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

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

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

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

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

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

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

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

那怎樣變長(zhǎng)呢?

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

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

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

1010110000000010

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

10101100

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

0101100

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

00000010

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

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

這個(gè)過(guò)程就是:

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

    0000010  +  0101100
->  100101100           // 拼接

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

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

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

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

有符號(hào)數(shù)的表示

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

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

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

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

這顯然不能滿足我們對(duì)數(shù)字變長(zhǎng)存儲(chǔ)的要求。

該怎么解決這個(gè)問(wèn)題呢?

既然無(wú)符號(hào)數(shù)字可以方便的進(jìn)行變長(zhǎng)編碼,那么我們將有符號(hào)數(shù)字映射稱(chēng)為無(wú)符號(hào)數(shù)字不就可以了 ,這就是所謂的ZigZag編碼,是不是很聰明,就像這樣:

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

...          ...

2147483647   4294967294
-2147483648  4294967295

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

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

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

    關(guān)注

    19

    文章

    7488

    瀏覽量

    87868
  • Server
    +關(guān)注

    關(guān)注

    0

    文章

    90

    瀏覽量

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

    關(guān)注

    0

    文章

    71

    瀏覽量

    10074
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    探討2對(duì)4二進(jìn)制解碼器及4到16二進(jìn)制解碼器配置

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

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

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

    二進(jìn)制

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

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

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

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

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

    二進(jìn)制電平,什么是二進(jìn)制電平

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

    二進(jìn)制加法程序【匯編版】

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

    二進(jìn)制加法程序【C語(yǔ)言版】

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

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

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

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

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

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

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

    二進(jìn)制解碼器案例說(shuō)明

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

    二進(jìn)制解碼器到底是什么

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

    二進(jìn)制解碼器開(kāi)源設(shè)計(jì)

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

    二進(jìn)制編碼器工作原理 如何選擇二進(jìn)制編碼器

    編碼器通常有多個(gè)輸入端(通常為2的n次方個(gè),其中n是編碼器的位數(shù)),和一個(gè)或多個(gè)輸出端。每個(gè)輸入端對(duì)應(yīng)一個(gè)二進(jìn)制位,而輸出端則表示輸入的二進(jìn)制值。 優(yōu)先編碼器 : 優(yōu)先編碼器是一種特殊的二進(jìn)制
    的頭像 發(fā)表于 11-06 09:44 ?676次閱讀
    主站蜘蛛池模板: 夜色福利院在线观看免费| 精品国产免费第一区二区| 免费果冻传媒在线完整观看| 久久久久嫩草影院精品| 野花日本韩国视频免费高清观看 | 精品国产mmd在线观看| 亚洲精品久久7777777| 国产午夜在线视频| 亚洲欧美日韩另类精品一区二区三区 | 欧美手机在线播放| 被老总按在办公桌吸奶头| 青青青青草原国产免费| 亚洲三级精品| 黑丝女仆恋上我| 亚洲精品永久免费| 国产亚洲精品免费视频| 新版孕妇bbwbbwbbw| 国产成人亚洲精品老王| 少妇高潮惨叫久久久久久欧美| 99久久亚洲精品影院| 美女露出逼| 99久久无码一区人妻A片竹菊 | 国产成人刺激视频在线观看| 欧美又粗又大AAAA片| GAY2022空少被体育生暴菊| 男人吃奶摸下挵进去啪啪| 99久久国产综合精品网成人影院| 美女MM131爽爽爽| 5566av资源| 日韩欧无码一区二区三区免费不卡 | 美女乱草鲍高清照片| OLDMAN老头456 TUBE| 日本强好片久久久久久AAA| av网站视频在线观看| 久久丫线这里只精品| 777米奇影院第七色色| 女人麻豆国产香蕉久久精品| 把极品白丝班长啪到腿软| 日操夜操天天操| 清晨紧湿爱运动h高h| 国产欧美日韩综合精品一区二区 |