#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 в текст в Википедии:
Чтобы ограничить использование результирующих символов использованием 64 символов (исключая заполнение =
), Base64 encode решил представлять только 6 бит на результирующий символ.
3 байта (24 бита) двоичных данных могут быть представлены в виде 4 (24 бита / 6 бит = 4) символов кодирования, что является минимальным количеством двоичных данных для полного использования каждого бита в выделенном символе кодирования. Для этого вам нужно будет сгруппировать 3 байта и закодировать их вместе.
Вот почему у них есть буфер в 3 байта для кодирования заданного потока байтов. Вы не будете ничего записывать, пока у вас не заполнится буфер или вы не дойдете до конца потока.