BASE64編碼原理與Golang代碼調用
阿新 • • 發佈:2018-08-15
lock 十進制數 打印 補齊 zab 常用 pre const sgu 一.概念簡介
Base64是一種基於64個可打印字符來表示二進制數據的表示方法。由於2^6=64,所以每6個比特為一個單元,對應某個可打印字符。3個字節有24個比特,對應於4個Base64單元,即3個字節可由4個可打印字符來表示。它可用來作為電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9,這樣共有62個字符,此外兩個可打印符號在不同的系統中而不同。
Base64常用於在通常處理文本數據的場合,表示、傳輸、存儲一些二進制數據
二.代碼調用
在Golang中提供了代碼庫可以供我們直接調用,用於實現Base64的編碼與解碼,其提供了對兩種格式的數據進行編碼(與解碼)
const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
來自golang源碼base64.go
1.標準數據(encodeStd)
msg := "Mac" //編碼 base64EncodedString := base64.StdEncoding.EncodeToString([]byte(msg)) fmt.Println("Base64編碼後:", base64EncodedString) //解碼 base64DecodedByte, err := base64.StdEncoding.DecodeString(base64EncodedString) if err != nil { log.Panic(err) } fmt.Println("Base64解碼後的字節數組:", base64DecodedByte) fmt.Println("Base64解碼後:", string(base64DecodedByte))
返回打印結果
Base64編碼後: TWFj
Base64解碼後的字節數組: [77 97 99]
Base64解碼後: Mac
2.URL數據(encodeURL)
msgUrl :="http://www.google.com" base64UrlEncodedString :=base64.URLEncoding.EncodeToString([]byte(msgUrl)) fmt.Println("Base64編碼後:", base64UrlEncodedString) base64UrlDecodedByte,err := base64.URLEncoding.DecodeString(base64UrlEncodedString) if err !=nil { log.Panic(err) } fmt.Println("Base64解碼後的字節數組:", base64UrlDecodedByte) fmt.Println("Base64解碼後:", string(base64UrlDecodedByte))
返回打印結果
Base64編碼後: aHR0cDovL3d3dy5nb29nbGUuY29t
Base64解碼後的字節數組: [104 116 116 112 58 47 47 119 119 119 46 103 111 111 103 108 101 46 99 111 109]
Base64解碼後: http://www.google.com
三.編碼原理
1.將每個字符轉成ASCII編碼(10進制)
fmt.Println([]byte(msg)) //[77 97 99]
2.將10進制編碼轉成2進制編碼
fmt.Printf("%b",[]byte(msg))
//[1001101 1100001 1100011]
補齊8位為:
[01001101 01100001 01100011]
3.將2進制編碼按照6位一組進行平分
010011 010110 000101 100011
4.轉成10進制數
010011 ==> 1x2^0 + 1x2^1 + 0 + 0 + 1x2^4 = 19
010110 ==> 0 + 1x2^1 + 1x2^2 + 0 + 1x2^4 = 22
000101 ==> 1x2^0 + 0 + 1 x 2^2 + 0 + 0 + 0 = 5
100011 ==> 1x2^0 + 1x2^1 + 0 + 0 + 0 + 1x2^5 = 35
5.將十進制數作為索引,從Base64編碼表中查找字符
19 對應 T
22 對應 W
5 對應 F
35 對應 j (註意是小寫)
註意
- 若文本為3個字符,則剛好編碼為4個字符長度(3 8 = 4 6)
- 若文本為2個字符,則編碼為3個字符,尾部用一個"="補齊
- 若文本為1個字符,則編碼為2個字符,尾部用兩個"="補齊
BASE64編碼原理與Golang代碼調用