Насколько я понимаю из спецификации, кодировщик Base64
a) берет исходный двоичный файл и дополняет его нулями, чтобы он был кратен 24 байтам.
б) затем он транскодирует его по шесть бит за раз в целевой набор из 64 символов (A..Z, a..z, 0..9, +, -). Если он обнаруживает, что последние два байта (16 бит) заполнены нулями, последние два символа перекодируются как '=='. Если он обнаруживает, что последний один байт (8 бит) был дополнен нулями, последний символ перекодируется как '='.
Мой вопрос на шаге (b): как узнать, что последние байты - это нули, потому что они были дополнены, а не нули, потому что они являются частью действительных двоичных исходных данных?
Должна ли подсистема, отвечающая за часть (b), знать, что происходило во время части (a)?





Кодировщик (в отличие от декодера) будет знать длину входных данных и сможет определить, выводить ли ничего, «=» или «==» в конце. В вашем вопросе предполагается, что между двумя упомянутыми вами этапами нет связи, но это неверно в реализациях, которые я видел.
Реализация написать, которая у меня была, вообще не выполняла первый этап, поскольку в ней были процедуры для извлечения 6-битных групп из входного потока по одной, увеличивая значение byteCount каждый раз. Затем, в конце, выражение «byteCount%3» использовалось, чтобы решить, какую строку добавить в выходной поток.