基本概念
Base64编码是一种广泛使用的二进制到文本的编码方法,它允许二进制数据通过仅使用64个ASCII字符的方式进行表示和传输。
这种编码方式特别适用于在不支持二进制数据的环境中传输数据,如在网页中嵌入图像数据或在电子邮件中发送附件。
Base64编码通过将每3个字节的二进制数据转换为4个字节的文本数据来工作,在原来数据体积上增加了约。
标准模式
package main
import (
"encoding/base64"
"fmt"
)
func main() {
var str string = "杨国强"
//标准加密
encoded := base64.StdEncoding.EncodeToString([]byte(str))
fmt.Printf("str:%v\n", encoded)
//标准解密
decoded, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
fmt.Printf("decode base 64 failed:%v\n", err)
return
}
fmt.Printf("str:%v\n", string(decoded))
}
运行结果:
# go run base64.go
str:5p2o5Zu95by6
str:杨国强
URL模式
URL和文件名安全方式是标准方式的变体,其输出用于URL和文件名。
因为+和/字符是标准Base64字符,这两个字符对URL和文件名编码则不安全,变体即使用-代替+,_(下划线)代替/。
对照表:
标准 | URL |
---|---|
+ | - |
/ | _ |
func decode() {
data := "hello world12345!?$*&()'-@~"
uEnc := base64.URLEncoding.EncodeToString([]byte(data))
// Base64 Url Decoding
uDec, err := base64.URLEncoding.DecodeString(uEnc)
if err != nil {
fmt.Printf("Error decoding string: %s ", err.Error())
return
}
fmt.Println(string(uDec)) // "hello world12345!?$*&()'-@~"
}
无填充编码
标准Base64编码对输出结果使用=进行填充。一般也建议使用填充方式,但一些场景无需填充。我们可以使用Raw方式编码即没有填充。
func main() {
data := "abc!?$*&()'-@~"
// Base64 Encoding without Padding
swEnc := base64.RawStdEncoding.EncodeToString([]byte(data))
fmt.Println(swEnc) // YWJjIT8kKiYoKSctQH4
// Base64 Url Encoding without Padding
uwEnc := base64.RawURLEncoding.EncodeToString([]byte(data))
fmt.Println(uwEnc) //YWJjIT8kKiYoKSctQH4
}
示例
编码
要对数据进行Base64编码,可以使用 StdEncoding.EncodeToString()。
以下是一个简单的示例,展示如何对字符串进行Base64编码:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
input := "Go语言标准库实战开发"
encodedString := base64.StdEncoding.EncodeToString([]byte(input))
fmt.Println("编码后的字符串:", encodedString)
}
解码
与编码过程相对应,解码是将Base64编码的字符串转换回原始数据。使用StdEncoding.DecodeString方法可以实现这一点。下面的示例演示了解码过程:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
encodedString := "R28lRTYlOTclODglRTQlQkIlODklRTUlQUQlQTAlRTQlQjglQUUlRTUlOEYlQkQ="
decodedBytes, err := base64.StdEncoding.DecodeString(encodedString)
if err != nil {
fmt.Println("解码错误:", err)
return
}
fmt.Println("解码后的字符串:", string(decodedBytes))
}
作者: