Golang的base64实现

Golang's base64 implementation

最近在看golang的base64实现

谁能解释一下编码器结构中 buf 的用途以及 Write 函数中的用法?

type encoder struct {
    err  error
    enc  *Encoding
    w    io.Writer
    buf  [3]byte    // buffered data waiting to be encoded
    nbuf int        // number of bytes in buf
    out  [1024]byte // output buffer
}

完整的实现如下:

https://golang.org/pkg/encoding/base64/#NewEncoder

坦克:)

base64 将输入的每个字节(8 位)编码为 6 位输出。将其舍入为整数字节单位 - 每 3 个字节的输入将产生 4 个字节的 base64 输出。

因此,在对字节流进行编码时,需要保持先前字节编码的状态,即 3 字节缓冲区。

那么,如果输入流长度不是 3 的倍数会怎样?当流结束时,缓冲区中任何剩余的部分字节(即 1 或 2 个字节)将用一个或两个 = 个字符填充。

你可以查看Wikipedia中Base64binary-to-text编码的例子:

为了将结果字符的使用限制为使用 the 64 characters(不包括填充 =),Base64 编码选择仅表示每个结果字符 6 位。

3字节(24位)的二进制数据可以表示为4(24位/6位=4)个编码字符,这是用完分配的编码字符中每一位的最小二进制数据数.为此,您需要将 3 个字节分组并将它们一起编码。

这就是为什么他们有一个 3 字节的缓冲区来编码给定的字节流。除非缓冲区已满或到达流的末尾,否则您不会写任何东西。