您好,登錄后才能下訂單哦!
這篇文章主要介紹了區塊鏈16進制數據的編碼/解碼算法是怎樣的的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇區塊鏈16進制數據的編碼/解碼算法是怎樣的文章都會有所收獲,下面我們一起來看看吧。
眾所周知,計算機存儲和處理的都是二進制數據。為了簡潔,實際上使用最多的是二進制的一個變種--16進制。比如筆者的名字叫嘉文,中文拼音是jiawen(全小寫),在計算機里存儲的就是 6A696177656E。
很明顯,人類容易記住jiawen,而其相應的16進制代碼6A696177656E就很考驗人的記憶力了。同樣的,人類很難記住16進制的數據,但是如果是16進制編碼的文本字符串就相對好記好讀一些了。以下是一張ASCII碼表的一部分。
十六進制的07是一個Bell(響鈴),如果試著用計算機程序去打印,結果是不可見也不可理解的,只能聽到一聲鈴聲。但是文本字符串“07”則相對容易理解和記憶。上文提到過,Bitcoin地址都是16進制的數,不做轉換,打印的話毫無意義,人類無法直觀的辨識。
大家可以想象一下查詢自己的銀行賬戶余額的場景,假如賬戶里只有77塊錢了,查詢結果的打印是大寫字符M(10進制的編碼是77)。我相信大部分的用戶都不知道那是77的意思。相對的,如果把數字77轉換成文本“77”(其16進制編碼是3737)后再打印,對于顯示在屏幕上的文本77,用戶就會理解了。總結一下:
下面的幾節將討論用文本來表示16進制數據的幾種編碼方式。
1、Base64
這是一種用64個字符來表示任意二進制數據的方法,通常exe、jpg、pdf等文件都是二進制文件,用文本編輯器打開都是亂碼,那么就需要一個方法,可以將二進制編碼成字符串的格式,這樣可以將二進制文件用文本打開查看。
那么,既然是BASE64,就是通過64個字符來編碼的,具體是哪64個字符呢?請見下表:
Base64編碼主要用在傳輸、存儲、表示二進制等領域,還可以用來加密,但是這種加密比較簡單,只是一眼看上去不知道什么內容罷了,當然也可以對Base64的字符序列進行定制來進行加密,我們來看下Base64的編碼過程。
首先,既然是使用上述64個字符的范圍來表示的,那么,要能夠表示出64個字符的各種組合,得起碼用6個bit才行,根據排列組合,6個bit可以總共表示出2的6次方的組合的字符排列;針對一份需要轉化的二進制文件,可以這樣來處理,每3個字節一組,這樣一共是24bit,然后可以針對這個24bit再來劃分,劃分成每6bit一組,這樣一共可以分成4組,分成4組6bit后,則對照上表去查找對應的字符就可以了,這樣就可以轉換為base64了,簡單吧。
那么,如果在3個字節一組劃分的時候,如果不是3的倍數怎么辦呢?這樣就需要使用\x00字節在末尾補足,再在編碼的末尾加上1個或2個=號,表示補了多少字節。
由于標準的Base64編碼后可能出現字符+和/,在URL中就不能直接作為參數,所以又有一種"url safe"的base64編碼,其實就是把字符+和/分別變成-和_。
根據這個原理,其實還是比較容易理解這種編碼思想的,而且,也可以看出,這種編碼是可以逆向的,以“yes”這個字符串為例,它的Base64編碼是eWVz,大家可以自行嘗試幾個例子。
2、Base58
顧名思義,Base58是基于58個字母和數字組成的,有了Base64的基礎,我們就比較容易理解Base58了,實際上就是Base64的一個子集,相對于Base64來說,Base58不包括以下Base64的字符:
數字0
大寫字母O
大寫字母I
小寫字母l
+與/
可以看出,小寫o和大寫O很容易和數字0混淆,小寫l和大寫I很容易和數字1混淆,Base58就是Base64去除了幾個看起來容易混淆的字符以及容易導致轉義的/和+。Base58的編碼表如下:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
必須注意,不同的應用實現使用的編碼表內容是一樣的,但是順序可能不一樣,比如:
1)比特幣地址:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
2)Ripple 地址:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
接下來我們來了解一下Base58Check,比特幣使用的是改進版的Base58算法,為了解決Base58編碼的字符串沒有完整性校驗機制。在傳播過程中,如果出現某些字符損壞或者遺漏,就沒法檢測出來了,所以使用了改進版的算法Base58Check,
3、 Base58Check
在二進制數據的傳輸過程中,為了防止數據傳輸的錯誤,保護數據安全,通常會加一個校驗碼。通過校驗碼的配合可以發現數據是否被破壞或者是否在發送時輸入錯誤了。Base58Check就是Base58加上校驗碼,或者可以說是Base58的一種編碼形式,在比特幣系統中生成錢包地址的時候就使用到了這種編碼形式。
我們知道,錢包地址是用來轉賬的,雖然Base58編碼已經可以做到避免一些容易混淆的字符,但是還不能保證用戶的誤輸入或者地址信息在傳輸過程中由于某種原因被破壞,這會給用戶帶來潛在的損失風險。
Base58Check的編碼方式是這樣的:進行編碼前,在待編碼的內容字符串中加入一個字節的版本信息,版本信息可以自行約定,比如比特幣地址采用了0×00作為版本信息,然后再啊計入編碼內容字符串的哈希值,通常只要取得哈希值中的4個字節就可以了,加到一起后,然后再整體進行Base58編碼。
比特幣地址的生成過程中,是將版本字節放在了頭部,而將4個字節的哈希值放在了尾部,然后進行編碼生成。這個原理還是很簡單的,哈希算法具有先天的數據完整性檢測能力,在這里我們又看到了哈希算法的又一個應用。
經過整理編碼后的數據在傳輸過程中如果有發生損壞或者篡改,接收方在得到數據后,會對原始數據進行同樣的校驗碼計算,并且和接收到的結果中的校驗碼進行比較。由于哈希算法的特點,只要原始數據有任何更改,計算出的哈希值都會發生變更,因此只要校驗碼不一致就說明數據不是合法的。
關于“區塊鏈16進制數據的編碼/解碼算法是怎樣的”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“區塊鏈16進制數據的編碼/解碼算法是怎樣的”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。