golang-标准库(encoding/base64)

Go语言实现Base64编码与解码
本文介绍了Go语言中的encoding/base64包,用于实现RFC 4648规定的Base64编码和解码。通过StdEncoding结构体的方法,可以方便地对数据进行编码和解码。编码时,Encode函数会将输出调整为4的倍数,适合小数据块,而大数据流推荐使用NewEncoder()。解码过程与编码对称,也有对应的流式解码方法。

base64是编程中常见的编码和进制,本文给出go语言中对base64编码的转化使用。

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("%s\n",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("%s\n",b) // 打印string:abcdef

	b,_ = base64.StdEncoding.DecodeString("YWJjZGVmZw") // 直接解码string
	fmt.Printf("%s\n",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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值