go語言培訓(xùn)班多少錢?這個看你在哪里學(xué)了,比如說跟著我的文檔節(jié)奏走,就不花一分錢,還有相應(yīng)視頻教程(基礎(chǔ)視頻+高級視頻),歡迎私聊找我領(lǐng)?。?/p>
10.1Base58字符編碼與解碼
10.1.1Base58
Base58是一種基于文本的二進(jìn)制編碼格式。這種編碼格式不僅實現(xiàn)了數(shù)據(jù)壓縮,保持了易讀性,還具有錯誤診斷功能。Base58是Base64編碼格式的子集,同樣使用大小寫字母和10個數(shù)字,但舍棄了一些容易錯讀和在特定字體中容易混淆的字符。Base58不含Base64中的0(數(shù)字0)、O(大寫字母o)、l(小寫字母L)、I(大寫字母i),以及“+”和“/”兩個字符。目的就是去除容易混淆的字符。簡而言之,Base58就是由不包括(0,O,l,I)的大小寫字母和數(shù)字組成。Base58字母表如下所示。
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
base58編碼的整體步驟就是不斷將數(shù)值對58取模,如果商大于58,則對商繼續(xù)取模。以字符串"a" 為例。在ASCII碼中,"a"的10進(jìn)制為97,具體步驟如下。
l?97對58取模,余數(shù)為39,商為1.
l?base58字符集中,索引下標(biāo)39為g
l?base58字符集中,索引下標(biāo)1為2
l得到結(jié)果為:g2
l反序列化后為:2g
以字符串?"ab" 為例。"ab"的16進(jìn)制為6162,轉(zhuǎn)10進(jìn)制后的結(jié)果為:24930,具體步驟如下。
l?24930對58取模,余數(shù)為48,商為429.
l?base58字符集中,索引下標(biāo)48為:q
l?429對58取模,余數(shù)為23,商為7.
l?base58字符集中,索引下標(biāo)23為:Q
l?base58字符集中,索引下標(biāo)7為:8
l得到結(jié)果為:qQ8
l反序列化后為:8Qq
接下來通過一個案例演示Base58編碼解碼,如例所示。
例1-1??Base58
1?package main
2?import (
3? "bytes"
4? "encoding/hex"
5? "fmt"
6? "math/big"
7?)
8?var base58Alphabets = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
9?func main(){
10? var arr = []byte("天地與我并生,萬物與我為宜")
11? cipherText := Base58Encode(arr)
12? fmt.Println("base58?編碼后:",string(cipherText))
13? fmt.Println("base58?解碼后:",string(Base58Decode(cipherText)))
14?}
15?
16?// Base58Encode encodes a byte array to Base58
17?func Base58Encode(input []byte) []byte {
18? var result []byte
19? x := big.NewInt(0).SetBytes(input)
20? base := big.NewInt(int64(len(base58Alphabets)))
21? zero := big.NewInt(0)
22? mod := &big.Int{}
23? for x.Cmp(zero) != 0 {
24? x.DivMod(x, base, mod)
25? result = append(result, base58Alphabets[mod.Int64()])
26? }
27? // https://en.bitcoin.it/wiki/Base58Check_encoding#Version_bytes
28? if input[0] == 0x00 {
29? result = append(result, base58Alphabets[0])
30? }
31? ReverseBytes(result)
32? return result
33?}
34?// Base58Decode decodes Base58-encoded data
35?func Base58Decode(input []byte) []byte {
36? result := big.NewInt(0)
37? for _, b := range input {
38? charIndex := bytes.IndexByte(base58Alphabets, b)
39? result.Mul(result, big.NewInt(58))
40? result.Add(result, big.NewInt(int64(charIndex)))
41? }
42? decoded := result.Bytes()
43? if input[0] == base58Alphabets[0] {
44? decoded = append([]byte{0x00}, decoded...)
45? }
46? return decoded
47?}
48?func Base58EncodeHexString(input string) string {
49? arr , _ := hex.DecodeString(input)
50? res := Base58Encode(arr)
51? return fmt.Sprintf("%s", res)
52?}
53?func ReverseBytes(data []byte) {
54? for i, j := 0, len(data)-1; i < j; i, j = i+1, j-1 {
55? data[i], data[j] = data[j], data[i]
56? }
57?}
運(yùn)行結(jié)果如圖所示。

圖10.1?運(yùn)行結(jié)果