Реализация Golang на base64

#go #base64

#Вперед #base64

Вопрос:

Недавно я присматривался к реализации golang на base64.

Может ли кто-нибудь объяснить назначение buf в структуре кодировщика и использование в функции записи?

 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

Резервуары 🙂

Ответ №1:

base64 кодирует каждый байт (8 бит) входных данных в 6 бит выходных данных. Чтобы округлить это до целых байтовых единиц — на каждые 3 байта ввода будет получено 4 байта base64 вывода.

Таким образом, при кодировании потока байтов требуется сохранение состояния из предыдущих байтовых кодировок, т.Е. 3-байтового буфера.

Итак, что произойдет, если длина входного потока не кратна 3? Когда поток заканчивается, все оставшиеся частичные байты в буфере (т. Е. 1 или 2 байта) будут дополнены одним или двумя = символами.

Ответ №2:

Вы можете проверить пример кодирования двоичного кода Base64 в текст в Википедии:

Пример кодирования на Base64

Чтобы ограничить использование результирующих символов использованием 64 символов (исключая заполнение = ), Base64 encode решил представлять только 6 бит на результирующий символ.

3 байта (24 бита) двоичных данных могут быть представлены в виде 4 (24 бита / 6 бит = 4) символов кодирования, что является минимальным количеством двоичных данных для полного использования каждого бита в выделенном символе кодирования. Для этого вам нужно будет сгруппировать 3 байта и закодировать их вместе.

Вот почему у них есть буфер в 3 байта для кодирования заданного потока байтов. Вы не будете ничего записывать, пока у вас не заполнится буфер или вы не дойдете до конца потока.