社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
base64是编程中常见的编码和进制,本文给出go语言中对base64编码的转化使用。
encoding/base64包实现了RFC 4648规定的base64编码。
encoding/base64包给我们提供了一个现成的结构体对象(StdEncoding),我们只需要使用这个对象的方法就可以对数据进行base64编码/解码。
下面是加密的三个相关方法 func (enc *Encoding) EncodedLen(n int) int =》 返回对n字节数据进行base64编码后的最大长度 func (enc *Encoding) Encode(dst, src []byte) =》将src的数据编码后存入dst, func (enc *Encoding) EncodeToString(src []byte) string =》返回将src编码后的字符串。
下面看代码例子:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
src := []byte("abcdefg") // 准备数据
n := base64.StdEncoding.EncodedLen(len(src)) // 计算加密后数据的长度
dst := make([]byte,n) // 创建容器
base64.StdEncoding.Encode(dst,src) // 加密数据
fmt.Println(dst) // 打印结果:[89 87 74 106 90 71 86 109 90 119 61 61]
fmt.Printf("%sn",dst) // 转换为字符串: YWJjZGVmZw==
fmt.Println(base64.StdEncoding.EncodeToString([]byte("abcdefg"))) // 结果:YWJjZGVmZw==
}
需要注意的是Encode函数会把输出设置为4的倍数,因此不建议对大数据流的独立数据块执行此方法,使用NewEncoder()代替。
下面看方法:
func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser =》创建一个新的base64流编码器。写入的数据会在编码后再写入w,写入完毕后,使用者必须调用Close方法以便将未写入的数据从缓存中刷新到w中。函数接受二个函数,env是一个编码/解码协议结构图,上面用到的base64.StdEncoding就是它的一个结构体对象,w是目标流对象。
下面看例子:
package main
import (
"encoding/base64"
"os"
)
func main() {
wd,_ := os.Getwd() // 获取当前的工作目录
file,_ := os.Create(wd+"/a.txt") // 创建一个文件,用来存储编码后的内容
wClose := base64.NewEncoder(base64.StdEncoding,file) // 新建一个流式的编码器
wClose.Write([]byte("abcdefg")) // 往编码器中写入数据
wClose.Close() // 关闭流,注意一定要手动调用Close方法,将缓存中还没写入到目标流的数据刷入到目标流里面
// 最后,abcdefg经过base64编码后的内容写入到了a.txt文件里面
}
解码的过程和编码的过程是完全对称相似的,所以不再详细介绍,我们直接看代码示例:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
code := []byte("YWJjZGVmZw") // base64加密数据
b := make([]byte, base64.StdEncoding.DecodedLen(len(code))) // 计算解码后的长度
base64.StdEncoding.Decode(b,code) // 解码
fmt.Printf("%sn",b) // 打印string:abcdef
b,_ = base64.StdEncoding.DecodeString("YWJjZGVmZw") // 直接解码string
fmt.Printf("%sn",b) // 打印string:abcdef
}
同理,解码流式数据也有对应的方法:
func NewDecoder(enc *Encoding, r io.Reader) io.Reader
原理与NewEncoder类似,不再演示。
至此,go提供的编码/解码base64方法就介绍完了。
除了base64之外,go也提供了base32编码,包为encoding/base32,里面的方法和base64如出一辙。本文也不再介绍,说一下base64和base32的区别。
base64:编码用到了大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/;
base32:编码只有大写字母(A-Z)和数字234567;
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!