Base64 编码原理
Base64 编码将二进制数据分组为 3 个字节(24 位),然后将其转换为 4 个 6 位的组,每个 6 位组再使用 64 个可打印的 ASCII 字符进行表示。64 个可打印的 ASCII 字符包括:
- 大写字母 A-Z (26 个)
- 小写字母 a-z (26 个)
- 数字 0-9 (10 个)
- 加号 +
- 斜杠 /
当待编码的数据长度不是 3 的倍数时,会进行填充,填充字符为 =。
举例:
假设我们要编码的二进制数据为 Man,其 ASCII 码分别为:
- M: 77
- a: 97
- n: 110
将这三个字节的二进制数据拼接起来,得到:
01001101 01100001 01101110
将其分成 4 个 6 位的组:
010011 010000 010110 111000
将每个 6 位组转换为十进制数:
19 16 22 56
最后根据 Base64 编码表,将十进制数转换为对应的 ASCII 字符:
T Q W g
因此,Man 的 Base64 编码为 TQIwg。
Go 语言 Base64 编码解码库
Go 语言标准库提供了 encoding/base64 包,用于 Base64 编码解码。该包提供了以下常用函数:
- StdEncoding.EncodeToString(src []byte): 将字节数组 src 编码为 Base64 字符串。
- StdEncoding.DecodeString(s string): 将 Base64 字符串 s 解码为字节数组。
- StdEncoding.Encode(dst []byte, src []byte): 将字节数组 src 编码为 Base64 字符串,并将结果写入 dst。
- StdEncoding.Decode(dst []byte, src []byte): 将 Base64 字符串 src 解码为字节数组,并将结果写入 dst。
Go 语言 Base64 编码解码实战
1. 编码字符串
package main
import (
"encoding/base64"
"fmt"
)
func main() {
str := "Hello, World!"
encodedStr := base64.StdEncoding.EncodeToString([]byte(str))
fmt.Println("编码后的字符串:", encodedStr)
}
输出:
编码后的字符串: SGVsbG8sIFdvcmxkIQ==
2. 解码字符串
package main
import (
"encoding/base64"
"fmt"
)
func main() {
encodedStr := "SGVsbG8sIFdvcmxkIQ=="
decodedStr, err := base64.StdEncoding.DecodeString(encodedStr)
if err != nil {
fmt.Println("解码错误:", err)
return
}
fmt.Println("解码后的字符串:", string(decodedStr))
}
输出:
解码后的字符串: Hello, World!
3. 编码文件
package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"os"
)
func main() {
// 读取文件内容
data, err := ioutil.ReadFile("test.txt")
if err != nil {
fmt.Println("读取文件错误:", err)
return
}
// 编码文件内容
encodedData := base64.StdEncoding.EncodeToString(data)
fmt.Println("编码后的文件内容:", encodedData)
// 写入编码后的文件内容
err = ioutil.WriteFile("test.txt.base64", []byte(encodedData), 0644)
if err != nil {
fmt.Println("写入文件错误:", err)
return
}
}
4. 解码文件
package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"os"
)
func main() {
// 读取编码后的文件内容
data, err := ioutil.ReadFile("test.txt.base64")
if err != nil {
fmt.Println("读取文件错误:", err)
return
}
// 解码文件内容
decodedData, err := base64.StdEncoding.DecodeString(string(data))
if err != nil {
fmt.Println("解码错误:", err)
return
}
// 写入解码后的文件内容
err = ioutil.WriteFile("test.txt.decoded", decodedData, 0644)
if err != nil {
fmt.Println("写入文件错误:", err)
return
}
}
Base64 编码解码的应用场景
- 网络传输: Base64 编码可以将二进制数据转换为可打印的 ASCII 字符串,适合用于网络传输,避免传输过程中出现乱码。
- 数据存储: Base64 编码可以将二进制数据存储在文本文件中,方便进行数据存储和管理。
- 加密解密: Base64 编码本身不具备加密功能,但可以与其他加密算法结合使用,提高数据安全性。
- 图片、音频、视频处理: Base64 编码可以将图片、音频、视频等二进制数据转换为字符串,方便进行数据处理和传输。
- URL 传输: Base64 编码可以将 URL 中的特殊字符进行编码,避免出现 URL 解析错误。
总结
本文详细介绍了 Go 语言 Base64 编码解码的原理、使用方法和应用场景。通过实际案例演示,读者可以快速掌握 Go 语言 Base64 编码解码的使用方法,并将其应用于实际开发中。