基本概念

Base64编码是一种广泛使用的二进制到文本的编码方法,它允许二进制数据通过仅使用64个ASCII字符的方式进行表示和传输。
这种编码方式特别适用于在不支持二进制数据的环境中传输数据,如在网页中嵌入图像数据或在电子邮件中发送附件。
Base64编码通过将每3个字节的二进制数据转换为4个字节的文本数据来工作,在原来数据体积上增加了约13\frac{1}{3}

标准模式

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))
}

作者: