溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的

發(fā)布時(shí)間:2022-01-19 10:05:50 來(lái)源:億速云 閱讀:1030 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹了區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

眾所周知,計(jì)算機(jī)存儲(chǔ)和處理的都是二進(jìn)制數(shù)據(jù)。為了簡(jiǎn)潔,實(shí)際上使用最多的是二進(jìn)制的一個(gè)變種--16進(jìn)制。比如筆者的名字叫嘉文,中文拼音是jiawen(全小寫),在計(jì)算機(jī)里存儲(chǔ)的就是 6A696177656E。

很明顯,人類容易記住jiawen,而其相應(yīng)的16進(jìn)制代碼6A696177656E就很考驗(yàn)人的記憶力了。同樣的,人類很難記住16進(jìn)制的數(shù)據(jù),但是如果是16進(jìn)制編碼的文本字符串就相對(duì)好記好讀一些了。以下是一張ASCII碼表的一部分。

區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的

十六進(jìn)制的07是一個(gè)Bell(響鈴),如果試著用計(jì)算機(jī)程序去打印,結(jié)果是不可見(jiàn)也不可理解的,只能聽(tīng)到一聲鈴聲。但是文本字符串“07”則相對(duì)容易理解和記憶。上文提到過(guò),Bitcoin地址都是16進(jìn)制的數(shù),不做轉(zhuǎn)換,打印的話毫無(wú)意義,人類無(wú)法直觀的辨識(shí)。

大家可以想象一下查詢自己的銀行賬戶余額的場(chǎng)景,假如賬戶里只有77塊錢了,查詢結(jié)果的打印是大寫字符M(10進(jìn)制的編碼是77)。我相信大部分的用戶都不知道那是77的意思。相對(duì)的,如果把數(shù)字77轉(zhuǎn)換成文本“77”(其16進(jìn)制編碼是3737)后再打印,對(duì)于顯示在屏幕上的文本77,用戶就會(huì)理解了??偨Y(jié)一下:

區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的

下面的幾節(jié)將討論用文本來(lái)表示16進(jìn)制數(shù)據(jù)的幾種編碼方式。

1、Base64

這是一種用64個(gè)字符來(lái)表示任意二進(jìn)制數(shù)據(jù)的方法,通常exe、jpg、pdf等文件都是二進(jìn)制文件,用文本編輯器打開(kāi)都是亂碼,那么就需要一個(gè)方法,可以將二進(jìn)制編碼成字符串的格式,這樣可以將二進(jìn)制文件用文本打開(kāi)查看。

那么,既然是BASE64,就是通過(guò)64個(gè)字符來(lái)編碼的,具體是哪64個(gè)字符呢?請(qǐng)見(jiàn)下表:

區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的

Base64編碼主要用在傳輸、存儲(chǔ)、表示二進(jìn)制等領(lǐng)域,還可以用來(lái)加密,但是這種加密比較簡(jiǎn)單,只是一眼看上去不知道什么內(nèi)容罷了,當(dāng)然也可以對(duì)Base64的字符序列進(jìn)行定制來(lái)進(jìn)行加密,我們來(lái)看下Base64的編碼過(guò)程。

首先,既然是使用上述64個(gè)字符的范圍來(lái)表示的,那么,要能夠表示出64個(gè)字符的各種組合,得起碼用6個(gè)bit才行,根據(jù)排列組合,6個(gè)bit可以總共表示出2的6次方的組合的字符排列;針對(duì)一份需要轉(zhuǎn)化的二進(jìn)制文件,可以這樣來(lái)處理,每3個(gè)字節(jié)一組,這樣一共是24bit,然后可以針對(duì)這個(gè)24bit再來(lái)劃分,劃分成每6bit一組,這樣一共可以分成4組,分成4組6bit后,則對(duì)照上表去查找對(duì)應(yīng)的字符就可以了,這樣就可以轉(zhuǎn)換為base64了,簡(jiǎn)單吧。

那么,如果在3個(gè)字節(jié)一組劃分的時(shí)候,如果不是3的倍數(shù)怎么辦呢?這樣就需要使用\x00字節(jié)在末尾補(bǔ)足,再在編碼的末尾加上1個(gè)或2個(gè)=號(hào),表示補(bǔ)了多少字節(jié)。

由于標(biāo)準(zhǔn)的Base64編碼后可能出現(xiàn)字符+和/,在URL中就不能直接作為參數(shù),所以又有一種"url safe"的base64編碼,其實(shí)就是把字符+和/分別變成-和_。

根據(jù)這個(gè)原理,其實(shí)還是比較容易理解這種編碼思想的,而且,也可以看出,這種編碼是可以逆向的,以“yes”這個(gè)字符串為例,它的Base64編碼是eWVz,大家可以自行嘗試幾個(gè)例子。

2、Base58

顧名思義,Base58是基于58個(gè)字母和數(shù)字組成的,有了Base64的基礎(chǔ),我們就比較容易理解Base58了,實(shí)際上就是Base64的一個(gè)子集,相對(duì)于Base64來(lái)說(shuō),Base58不包括以下Base64的字符:

  • 數(shù)字0

  • 大寫字母O

  • 大寫字母I

  • 小寫字母l

  • +與/

可以看出,小寫o和大寫O很容易和數(shù)字0混淆,小寫l和大寫I很容易和數(shù)字1混淆,Base58就是Base64去除了幾個(gè)看起來(lái)容易混淆的字符以及容易導(dǎo)致轉(zhuǎn)義的/和+。Base58的編碼表如下:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

必須注意,不同的應(yīng)用實(shí)現(xiàn)使用的編碼表內(nèi)容是一樣的,但是順序可能不一樣,比如:

1)比特幣地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

接下來(lái)我們來(lái)了解一下Base58Check,比特幣使用的是改進(jìn)版的Base58算法,為了解決Base58編碼的字符串沒(méi)有完整性校驗(yàn)機(jī)制。在傳播過(guò)程中,如果出現(xiàn)某些字符損壞或者遺漏,就沒(méi)法檢測(cè)出來(lái)了,所以使用了改進(jìn)版的算法Base58Check,

3、 Base58Check

在二進(jìn)制數(shù)據(jù)的傳輸過(guò)程中,為了防止數(shù)據(jù)傳輸?shù)腻e(cuò)誤,保護(hù)數(shù)據(jù)安全,通常會(huì)加一個(gè)校驗(yàn)碼。通過(guò)校驗(yàn)碼的配合可以發(fā)現(xiàn)數(shù)據(jù)是否被破壞或者是否在發(fā)送時(shí)輸入錯(cuò)誤了。Base58Check就是Base58加上校驗(yàn)碼,或者可以說(shuō)是Base58的一種編碼形式,在比特幣系統(tǒng)中生成錢包地址的時(shí)候就使用到了這種編碼形式。

我們知道,錢包地址是用來(lái)轉(zhuǎn)賬的,雖然Base58編碼已經(jīng)可以做到避免一些容易混淆的字符,但是還不能保證用戶的誤輸入或者地址信息在傳輸過(guò)程中由于某種原因被破壞,這會(huì)給用戶帶來(lái)潛在的損失風(fēng)險(xiǎn)。

Base58Check的編碼方式是這樣的:進(jìn)行編碼前,在待編碼的內(nèi)容字符串中加入一個(gè)字節(jié)的版本信息,版本信息可以自行約定,比如比特幣地址采用了0×00作為版本信息,然后再啊計(jì)入編碼內(nèi)容字符串的哈希值,通常只要取得哈希值中的4個(gè)字節(jié)就可以了,加到一起后,然后再整體進(jìn)行Base58編碼。

比特幣地址的生成過(guò)程中,是將版本字節(jié)放在了頭部,而將4個(gè)字節(jié)的哈希值放在了尾部,然后進(jìn)行編碼生成。這個(gè)原理還是很簡(jiǎn)單的,哈希算法具有先天的數(shù)據(jù)完整性檢測(cè)能力,在這里我們又看到了哈希算法的又一個(gè)應(yīng)用。

經(jīng)過(guò)整理編碼后的數(shù)據(jù)在傳輸過(guò)程中如果有發(fā)生損壞或者篡改,接收方在得到數(shù)據(jù)后,會(huì)對(duì)原始數(shù)據(jù)進(jìn)行同樣的校驗(yàn)碼計(jì)算,并且和接收到的結(jié)果中的校驗(yàn)碼進(jìn)行比較。由于哈希算法的特點(diǎn),只要原始數(shù)據(jù)有任何更改,計(jì)算出的哈希值都會(huì)發(fā)生變更,因此只要校驗(yàn)碼不一致就說(shuō)明數(shù)據(jù)不是合法的。

關(guān)于“區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“區(qū)塊鏈16進(jìn)制數(shù)據(jù)的編碼/解碼算法是怎樣的”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI