最近在學習位元幣的base58編碼,發現網上很多的教程都不行,所以還是自己寫一個吧,
1 錯誤教程例1
https://blog.csdn.net/qin9800/article/details/105081894
print(b58encode("ABDCDEFGA"))
print(b58decode("qBLiPgShKjap"))
這里b58encode("ABDCDEFGA")明顯就不對,十六進制數怎么出來G呢?
輸入
print(b58encode("6fd9c637cc30bb0fe9add3a185c1f5d884d12b7b783bcba0fb"))
結果竟然是:
fsooVZR57AsiteqgXuXYNeuqe3F85mpamYttiB5VeHmCSb66MNkPz7KWPofjigm5UVdK
比十六進制的數還長,這不搞笑么?
2 錯誤教程例2
https://www.jianshu.com/p/d8af38e091be
這里采用的編碼順序是
$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
我們講的是位元幣好不好,先大寫字母,后小寫字母,編碼都錯了,還搞什么
3 base58編碼介紹
base58和base64一樣是一種二進制轉可視字串的演算法,主要用來轉換大整數值,區別是,轉換出來的字串,去除了幾個看起來會產生歧義的字符,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字符,如/, +,結果字符集正好58個字符(包括9個數字,24個大寫字母,25個小寫字母),不同的應用實作中,base58 最后查詢的字母表可能不同,所以沒有具體的標準,下面是幾個應用中的字母表:
位元幣地址:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Monero 地址
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Ripple 地址
rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz
Flickr 的短URL
123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
4 python3.6實作
base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58encode(tmp:str) -> str:
temp=0
for i in range(len(tmp)):
temp = temp * 16 +int(tmp[i],16)
tmp=[]
while True:
tmp.insert(0, temp % 58)
temp = temp // 58
if temp == 0:
break
temp = ""
for i in tmp:
temp += base58[i]
return temp
def b58decode(tmp:str) -> str:
temp = []
for i in tmp:
temp.append(base58.index(i))
tmp = temp[0]
for i in range(len(temp)-1):
tmp = tmp * 58 + temp[i+1]
return hex(tmp)
print(b58encode("AB"))
print(b58decode("3x"))
print(b58encode("6fd9c637cc30bb0fe9add3a185c1f5d884d12b7b783bcba0fb"))
print(b58decode("n1NSP78VQ5iZqVVRMA9ZZ2r77eeGLnwdj8"))
輸出結果:
3x
0xab
n1NSP78VQ5iZqVVRMA9ZZ2r77eeGLnwdj8
0x6fd9c637cc30bb0fe9add3a185c1f5d884d12b7b783bcba0fb
編碼正確且可逆,成功
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/385679.html
標籤:區塊鏈
上一篇:能源區塊鏈應用實體及特點分析
