Base64的使用
Golang内置支持Base64编码解码,Go的encoding/base64
包遵照RFC 4648规范实现了base64编码解码功能,包括标准方式
以及URL/文件名称
安全方式编码。
标准方式编码解码
RFC 4648规范约定标准Base64对任何二进制数据使用US-ASCII字符子集进行编码,字符包括:A-Z
, a-z
, 0-9
, +
, and /
1 2 3 4 5 6 7 8 9 10
| func main() { data := "我爱Go语言" fmt.Println(base64.StdEncoding.EncodeToString([]byte(data)))
txt,err := base64.StdEncoding.DecodeString("5oiR54ixR2/or63oqIA=") fmt.Println(string(txt),err) }
|
URL和文件名安全编码解码
URL和文件名安全方式是标准方式的变体,其输出用于URL和文件名。因为+
和/
字符是标准Base64字符对URL和文件名编码不安全,变体即使用-
代替+
,_
(下划线)代替/
。
1 2 3 4 5 6 7 8 9 10
| func main() { data := "我爱Go语言" fmt.Println(base64.URLEncoding.EncodeToString([]byte(data)))
txt, err := base64.URLEncoding.DecodeString("5oiR54ixR2_or63oqIA=") fmt.Println(string(txt), err) }
|
无填充编码
标准Base64编码对输出结果使用=
进行填充。一般也建议使用填充方式,但一些场景无需填充。我们可以使用Raw方式编码即没有填充
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| func main() { data := "我爱Go语言" fmt.Println(base64.RawStdEncoding.EncodeToString([]byte(data))) fmt.Println(base64.RawURLEncoding.EncodeToString([]byte(data)))
txt, err := base64.RawStdEncoding.DecodeString("5oiR54ixR2/or63oqIA") fmt.Println(string(txt), err) txt1, err := base64.RawStdEncoding.DecodeString("5oiR54ixR2_or63oqIA") fmt.Println(string(txt1), err) }
|
hex和md5编码
hex编码
1 2 3 4 5 6 7 8 9 10 11 12 13
| func main() { data := []byte("我爱Go语言")
fmt.Printf("%x\n",data)
fmt.Println(hex.EncodeToString(data))
txt,_ := hex.DecodeString("e68891e788b1476fe8afade8a880") fmt.Println(string(txt)) }
|
md5的hash计算
计算字符串的md5 hash
1 2 3 4 5 6 7 8 9 10
| func main() {
fmt.Printf("%x\n",md5.Sum([]byte("我爱go语言"))) re := md5.Sum([]byte("我爱go语言")) fmt.Printf("%X\n",re) }
|
分批次写入字符串一起计算md5
分别写入我爱
和go语言
一起计算md5值
1 2 3 4 5 6
| func main() { hasher := md5.New() hasher.Write([]byte("我爱")) hasher.Write([]byte("go语言")) fmt.Println(hex.EncodeToString(hasher.Sum(nil))) }
|
计算md5值加盐
1 2 3 4 5 6 7 8 9 10
| func main() { salt := time.Now().Unix() m5 := md5.New() m5.Write([]byte("我爱go语言")) m5.Write([]byte(string(salt))) st := m5.Sum(nil)
fmt.Println(hex.EncodeToString(st)) }
|
计算文件md5小工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| func main() { var name string flag.StringVar(&name,"p","","path") flag.Parse()
if name == ""{ return }
f,err := os.Open(name) defer f.Close() if err != nil{ fmt.Println("文件打开失败",err) return }
hasher := md5.New() ctx := make([]byte,1024) for { n,err := f.Read(ctx) if err == io.EOF { break } hasher.Write(ctx[:n]) } fmt.Printf("%x",hasher.Sum(nil)) }
|
运行示例
1 2 3 4 5 6 7
| $ go run fileio.go -p fileio.go 12af4076365a97ae5123f02e6133e3f5
$ md5 fileio.go MD5 (fileio.go) = 12af4076365a97ae5123f02e6133e3f5
|