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

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

Ответ 1

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

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

ceil(n / 3) * 4

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

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

Ответ 2

От Wikipedia

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

Итак, 16kb * 4/3 дает очень мало над 21,3 'kb, или 21848 байт, если быть точным.

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Примечание: Flooring объясняется тем, что во время моего теста на С#, если последняя строка заканчивается ровно на 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.