Это невозможно побитово , но 3 байта за раз, или умножение на 3 байта за раз будет !.
Другими словами, если вы разбиваете свой входной файл на «чанки», размер (ы) которых кратен 3 байтам, вы можете отдельно кодировать чанки и собирать воедино полученные B64-кодированные куски (в соответствующих orde, конечно. Обратите внимание, что последний chuink не должен быть точно кратным 3 байтам в размере, в зависимости от значения по модулю 3 его размера его соответствующее значение B64 будет иметь несколько из этих символов заполнения (обычно это знак равенства) но это нормально, так как это будет единственная часть, которая имеет (и нуждается) в таком заполнении.
В направлении декодирования это та же идея, за исключением того, что вам нужно разделить B64-кодированные данные на кратные 4 байта. Декодируйте их параллельно / индивидуально по желанию и заново объедините исходные данные, сложив декодированные части вместе (снова в том же порядке).
Пример:
Содержимое "File" =
"Never argue with the data." (Jimmy Neutron)
.
Прямое кодирование = Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=
Теперь, кусками:
"Never argue
-> Ik5ldmVyIGFyZ3Vl
with the
-> IHdpdGggdGhl
data." (Jimmy Neutron)
-> IGRhdGEuIiAoSmltbXkgTmV1dHJvbik=
Как видно из фрагмента в этом порядке, 3 закодированных фрагмента равны количеству кода, созданного для всего файла.
Декодирование выполняется аналогично с произвольным размером фрагмента при условии, что они кратны 4 байтам. Совершенно не обязательно иметь какое-либо соответствие между размерами, используемыми для кодирования. (хотя стандартизация по одному размеру для каждого направления (скажем, 300 и 400) может сделать вещи более однородными и более простыми в управлении.