go base64 编码.md

本文介绍了Go语言中Base64的编码和解码,包括两个默认的编解码器,异常类CorruptInputError的处理,以及各种编码解码方法如Decode, DecodeString, Encode, EncodeToString等。此外,还讨论了适用于大文件的流解码器NewDecoder和流编码器NewEncoder的使用。" 77725597,6898095,Flume容灾sink处理器详解,"['hadoop', 'flume', '容灾', '数据处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个默认的编/解码器:

// 使用 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值