Base64: Какое худшее возможное увеличение использования пространства?

Если сервер получил строку base64 и хотел проверить ее длину перед преобразованием, скажем, он всегда хотел, чтобы конечный байтовый массив составлял 16 КБ. Насколько большим может быть массив байтов размером 16 КБ при преобразовании в строку Base64 (при условии, что по одному байту на символ)?

6 ответов

Решение

Base64 кодирует каждый набор из трех байтов в четыре байта. Кроме того, вывод дополняется, чтобы всегда быть кратным четырем.

Это означает, что размер представления base-64 строки размера n:

ceil(n / 3) * 4

Таким образом, для массива 16 КБ представление base-64 будет иметь значение ceil(16*1024/3)*4 = 21848 байт длиной ~= 21,8 КБ.

Грубое приближение будет таким, что размер данных увеличится до 4/3 оригинала.

Из Википедии

Обратите внимание, что при вводе n байтов вывод будет иметь длину (n + 2 - ((n + 2) % 3)) / 3 * 4 байта, так что число выходных байтов на входной байт сходится к 4 / 3 или 1.33333 для большого n.

Таким образом, 16 КБ * 4 / 3 дает очень немного больше 21,3'КБ, или 21848 байт, если быть точным.

Надеюсь это поможет

16 КБ - 131 072 бита. Base64 упаковывает 24-битные буферы в четыре 6-битных символа каждый, поэтому у вас будет 5,462 * 4 = 21,848 байт.

Поскольку вопрос касался наихудшего возможного увеличения, я должен добавить, что обычно каждые 80 символов существуют разрывы строк. Это означает, что если вы сохраняете данные в кодировке base64 в текстовый файл в Windows, то в Linux добавляется 2 байта, в Linux - 1 байт на каждую строку.

Увеличение от фактического кодирования было описано выше.

Это ссылка на будущее для меня. Поскольку речь идет о худшем случае, мы должны учитывать перенос строки. В то время как RFC 1421 определяет максимальную длину строки как 64 символа, RFC 2045 (MIME) утверждает, что максимум 76 символов в одной строке.

Последний вариант реализован в библиотеке C#. Итак, в среде Windows, где разрыв строки составляет 2 символа (\r\n), мы получаем следующее:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

Примечание. Настил возникает потому, что во время моего теста с C#, если последняя строка заканчивается ровно 76 символами, разрыв строки не следует.

Я могу доказать это, запустив следующий код:

byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);

Ответ для 16 кбайт, закодированных в base64 с 76-символьными строками: 22422 символа

Предположим, что в Linux это будет Length = Floor(Ceiling(N/3) * 4 * 77 / 76) но я еще не успел протестировать его на своем ядре.NET.

Также это будет зависеть от фактической кодировки символов, т.е. если мы кодируем строку UTF-32, каждый символ base64 будет потреблять 3 дополнительных байта (4 байта на символ).

Другие вопросы по тегам