這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
基本概念
hex也稱為base16,意思是使用16個可見字元來表示一個位元組,編碼後資料大小將翻倍,因為1個字元需要用2個可見字元來表示。
base32,意思是使用32個可見字元來表示一個位元組,編碼後資料大小變成原來的8/5,也即5個字元用8個可見字元表示,但是最後如果不足8個字元,將用=來補充。
base64,意思是使用64個可見字元來表示一個位元組,編碼後資料大小變成原來的4/3,也即3個字元用4個可見字元來表示。
用例
看個例子:
package mainimport "fmt"import "encoding/hex"import "encoding/base32"import "encoding/base64"func main() { s := "hello world!" sb := []byte(s) hexString := hex.EncodeToString(sb) hexByte, err := hex.DecodeString(hexString) fmt.Println(hexString) // 68656c6c6f20776f726c6421 fmt.Println(hexByte, err) // [104 101 108 108 111 32 119 111 114 108 100 33] <nil> base32StdString := base32.StdEncoding.EncodeToString(sb) base32HexString := base32.HexEncoding.EncodeToString(sb) base32StdByte, err1 := base32.StdEncoding.DecodeString(base32StdString) base32HexByte, err2 := base32.HexEncoding.DecodeString(base32HexString) fmt.Println(base32StdString) // NBSWY3DPEB3W64TMMQQQ==== fmt.Println(base32HexString) // D1IMOR3F41RMUSJCCGGG==== fmt.Println(base32StdByte, err1) // [104 101 108 108 111 32 119 111 114 108 100 33] <nil> fmt.Println(base32HexByte, err2) // [104 101 108 108 111 32 119 111 114 108 100 33] <nil> base64StdString := base64.StdEncoding.EncodeToString(sb) base64UrlString := base64.URLEncoding.EncodeToString(sb) base64StdByte, err1 := base64.StdEncoding.DecodeString(base64StdString) base64UrlByte, err2 := base64.URLEncoding.DecodeString(base64UrlString) fmt.Println(base64StdString) // aGVsbG8gd29ybGQh fmt.Println(base64UrlString) // aGVsbG8gd29ybGQh fmt.Println(base64StdByte, err1) // [104 101 108 108 111 32 119 111 114 108 100 33] <nil> fmt.Println(base64UrlByte, err2) // [104 101 108 108 111 32 119 111 114 108 100 33] <nil>}
使用情境
有些小夥伴可能有疑問,為啥要把 "hello world!" 這麼明白的東西變成一串看不懂的東西,其實是這個例子使用了可見字元而已,而有很多字元是不可見的,我們需要把這些不可見字元變成可見字元。那為啥要變成可見字元?你是看著亂碼舒服還是看著可見字元舒服呢?其實不僅僅舒不舒服的問題,有些時候還必須要用可見字元,例如在網路中傳輸資料時,不同路由器對於不可見字元的處理是不同的,因此可能出現資料錯誤,因此還必須使用可見字元。
區別與聯絡
區別主要就是空間效率的區別,base64是具有比較高的空間效率的。當然,hex編碼不區分大小寫,但是base32與base64是區分的。
聯絡就是大家都是一種穩定的把位元組變成可見字元的編碼方式。
base32中StdEncoding和HexEncoding所使用的字元不同,但是具體其他區別我也不是很清楚。
base64中URLEncoding一般用於編碼URL