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