文章目录
两个默认的编/解码器:
// 使用 RFC 4648 定义的标准 base64 编码字符集初始化的编解码器
var StdEncoding = NewEncoding(encodeStd)
// 使用 RFC 4648 定义的标准 base64 编码字符集初始化的编解码器,用于URL和文件名。
var URLEncoding = NewEncoding(encodeURL)
这两个变量可以直接拿来用,比如将一个图片序列化:
imgPath := "/home/hongyu/图片/wallhaven-672612.jpg"
imgf, err := os.Open(imgPath)
// if err != nil{...}
data, err := ioutil.ReadAll(imgf)
// if err != nil {...}
b64 := base64.StdEncoding.EncodeToString(data) // 序列化为字符串
序列化一个 url:
url := []byte("https://www.bilibili.com/bangumi/media/md28223790/?from=search&seid=458027751011287317")
b64 = base64.URLEncoding.EncodeToString(url)
异常类 CorruptInputError
当编/解码遇到非法字符就会返回 该异常类
编解码类 Encoding
type Encoding struct {
// 内含隐藏或非导出字段
}
双向的编码/解码协议,根据一个64字符的字符集定义,RFC 4648 标准化了两种字符集。默认字符集用于 MIME(RFC 2045)和 PEM(RFC 1421)编码;另一种用于 URL 和文件名,用 ‘-’ 和 ‘_’ 替换了 ‘+’ 和 ‘/’。
函数 NewEncoding
func NewEncoding(encoder string) *Encoding
使用给出的字符集生成一个 *Encoding
,字符集必须是 64 字节的字符串。
方法 DecodedLen 返回n字节解码后字符串最大长度
func (enc *Encoding) DecodedLen(n int) int
返回 n 字节base64编码的数据解码后的最大长度。
方法 Decode 解码到一个 []byte
func (enc *Encoding) Decode(dst, src []byte) (n int, err error)
将 src 的数据解码后存入 dst,最多写DecodedLen(len(src))字节数据到dst,并返回写入的字节数。 如果src包含非法字符,将返回成功写入的字符数和CorruptInputError。换行符(\r、\n)会被忽略。
方法 DecodeString 数据为 string 类型,解码返回 []byte
func (enc *Encoding) DecodeString(s string) ([]byte, error)
方法 EncodedLen 返回编码后的长度
func (enc *Encoding) EncodedLen(n int) int
返回 n 字节数据进行 base64 编码后的最大长度。
方法 Encode 编码
func (enc *Encoding) Encode(dst, src []byte)
将 src 的数据编码后存入dst,最多写 EncodedLen(len(src))
字节数据到 dst,并返回写入的字节数。
函数会把输出设置为 4 的倍数,因此不建议对大数据流的独立数据块执行此方法,使用 NewEncoder()
代替。
方法 EncodeToString 编码为 字符串
func (enc *Encoding) EncodeToString(src []byte) string
返回将src编码后的字符串。
NewDecoder 流解码器(大文件用)
func NewDecoder(enc *Encoding, r io.Reader) io.Reader
创建一个新的 base64
流解码器。
imgPath := "./src/test/base64/a.jpg"
b64Path := "./src/test/base64/a.txt"
r, _ := os.Open(b64Path)
dst, _ := os.OpenFile(imgPath, os.O_WRONLY|os.O_CREATE, os.FileMode(0666))
defer dst.Close()
defer r.Close()
writer := bufio.NewWriter(dst)
de := base64.NewDecoder(base64.StdEncoding, r)
data := make([]byte, 66)
for {
n, err := de.Read(data)
// fmt.Println(data)
if n > 0 {
writer.Write(data)
}
if err == io.EOF {
writer.Flush()
return
} else if err != nil {
panic(err)
}
}
NewEncoder 流编码器 (大文件用)
func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser
创建一个新的base64流编码器。写入的数据会在编码后再写入 w,base32 编码每3字节执行一次编码操作;写入完毕后,使用者必须调用Close方法以便将未写入的数据从缓存中刷新到w中。
imgPath := "/home/hongyu/图片/wallhaven-672612.jpg"
imgf, err := os.Open(imgPath)
// if err != nil {...}
dstf, err := os.OpenFile("./src/test/base64/a.txt", os.O_WRONLY|os.O_CREATE, os.FileMode(0666))
// if err != nil {...}
en := base64.NewEncoder(base64.StdEncoding, dstf)
block := make([]byte, 64)
for {
n, err := imgf.Read(block)
if n > 0 {
en.Write(block)
}
if err == io.EOF {
return
} else if err != nil {
panic(err)
}
}
en.Close()