go語言培訓(xùn)班多少錢

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é)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容