golang-标准库(encoding/base64) - Go语言中文社区

golang-标准库(encoding/base64)


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("%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;

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/itpika/article/details/94576598
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 18:08:47
  • 阅读 ( 1084 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢