Как encode и decode 64 выясняют, что последние несколько нулей — это просто дополнение?

#base64 #tobase64string

#base64 #tobase64string

Вопрос:

https://docs.microsoft.com/en-us/dotnet/api/system.convert.tobase64string?view=net-5.0

В нем говорится

Если целое число 3-байтовых групп не существует, оставшиеся байты эффективно дополняются нулями, чтобы сформировать полную группу. В этом примере значение последнего байта равно шестнадцатеричному FF . Первые 6 бит равны десятичной системе счисления 63, что соответствует базовой 64-разрядной цифре «/» в конце вывода, а следующие 2 бита дополняются нулями, чтобы получить десятичную систему счисления 48, что соответствует базовой 64-разрядной цифре «w». Последние два 6-битных значения являются дополнением и соответствуют символу заполнения без значения «=».

Теперь,

Представьте, что массив байтов, который я отправляю, равен

0

Итак, только один байт, а именно 0

Этот один байт будет добавлен прямо в 000, верно?

Итак, теперь у нас будет что-то вроде 0 === в качестве кодировки, потому что для кодирования 3 байтов в кодировке base 64 требуется 4 символа.

Теперь мы это расшифруем.

Откуда мы знаем, что исходный байт не 00 или 000, а просто 0?

Должно быть, я что-то здесь упускаю.

Комментарии:

1. Я не совсем уверен, так что это не ответ, но я думаю, что вы в основном находитесь в одном примере M здесь . Начиная с первого байта 0, base64 сгенерирует два символа A. Чтобы заполнить оставшиеся биты второго A, будет добавлено 4 нуля. Тогда два оставшихся блока пусты. При декодировании он может утверждать, что последний блок A является неполным благодаря заполнению =, и из «AA» он может восстановить один байт 0.

2. О, я понимаю. Итак, 0-> AA== 00-> AAA= и 000 будут AAAA

Ответ №1:

Итак, теперь у нас будет что-то вроде 0 === в качестве кодировки

3 символа заполнения недопустимы. Это будет означать 6 бит плюс дополнение.

И тогда 0 в качестве байтового значения находится A в Base64, так и было бы AA== .

Итак, первый A содержит первые 6 бит байта 0, второй A вносит 2 оставшихся бита 0 для вашего байта, а затем остается всего 4 бита 0 плюс дополнение, чего недостаточно для второго байта.

Откуда мы знаем, что исходный байт не 00 или 000, а просто 0?

AA== имеет только 12 бит (6 бит на символ), поэтому он может кодировать только 1 байт => 0

AAA= имеет 18 бит, достаточно для 2 байт => 00

AAAA имеет 24 бита = 3 байта => 000