Ваш вывод о том, что отступы не нужны, верен.Всегда можно однозначно определить длину входных данных по длине кодированной последовательности.
Однако заполнение полезно в ситуациях, когда закодированные строки base64 объединяются таким образом, что длины отдельных последовательностей равнытеряется, как, например, в очень простом сетевом протоколе.
Если объединены строки unpadded , восстановить исходные данные невозможно, поскольку информация о количестве нечетных байтов в конце каждой отдельной последовательности теряется.Однако, если используются дополненные последовательности, нет никакой двусмысленности, и последовательность в целом может быть правильно декодирована.
Редактировать: Иллюстрация
Предположим, у нас есть программа, которая кодирует слова base64,объединяет их и отправляет по сети.Он кодирует «I», «AM» и «TJM», сжимает результаты вместе без заполнения и передает их.
I
кодирует в SQ
(SQ==
с заполнением) AM
кодирует в QU0
(QU0=
с отступом) TJM
кодирует в VEpN
(VEpN
с заполнением)
Такпередаваемые данные SQQU0VEpN
.Приемник base64-декодирует это как I\x04\x14\xd1Q)
вместо намеченного IAMTJM
.Результат бессмыслен, поскольку отправитель уничтожил информацию о том, где заканчивается каждое слово в закодированной последовательности.Если бы отправитель вместо этого отправил SQ==QU0=VEpN
, получатель мог бы декодировать это как три отдельные последовательности base64, которые объединялись бы, чтобы дать IAMTJM
.
Зачем беспокоиться о заполнении?
Почему бы не просторазработать протокол для префикса каждого слова с целой длиной?Тогда получатель сможет правильно декодировать поток, и не будет необходимости в заполнении.
Это отличная идея, если мы знаем длину данных, которые мы кодируем, прежде чем мыначать кодировать это.Но что, если бы вместо слов мы кодировали фрагменты видео с живой камеры?Мы можем заранее не знать длину каждого блока.
Если бы в протоколе использовалось заполнение, не было бы необходимости передавать длину вообще.Данные могут быть закодированы так, как они поступили с камеры, каждый фрагмент завершается заполнением, и получатель сможет правильно декодировать поток.
Очевидно, это очень надуманный пример, но, возможно, он иллюстрирует, почему заполнениеможет быть полезным в некоторых ситуациях.