Подтвердить что ты не робот

Вычислить размер для сообщения с кодировкой Base 64

У меня есть двоичная строка, которую я кодирую в Base 64. Теперь мне нужно знать перед собой, что размер последней кодированной строки Base 64 будет.

Есть ли способ вычислить это?

Что-то вроде:

BinaryStringSize - 64 КБ После кодирования EncodedBinaryStringSize будет 127Kb.

О, код находится в C.

Спасибо.

4b9b3361

Ответ 1

Если вы используете Base64 точно вправо, и это включает в себя заполнение конца символами =, и вы разбиваете его на CR LF каждые 72 символа, ответ можно найти с помощью:

code_size    = ((input_size * 4) / 3);
padding_size = (input_size % 3) ? (3 - (input_size % 3)) : 0;
crlfs_size   = 2 + (2 * (code_size + padding_size) / 72);
total_size   = code_size + padding_size + crlfs_size;

В C вы также можете завершить с помощью \0 -byte, так что там будет лишний байт, и вы можете проверить длину в конце каждого кода, когда будете писать их, поэтому, если вы 'просто просматривая то, что вы переходите на malloc(), вы можете предпочесть версию, которая отнимает несколько байтов, чтобы упростить кодирование:

output_size = ((input_size * 4) / 3) + (input_size / 96) + 6;

Ответ 2

geocar answer был близок, но иногда он мог быть немного.

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

input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) 

Разделите это на 3, затем умножьте на 4. Это наш общий размер вывода, включая отступы.

code_padded_size = ((input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) ) / 3) * 4

Как я уже сказал в своем комментарии, общий размер должен быть разделен на ширину линии перед удвоением, чтобы должным образом учитывать последнюю строку. В противном случае количество символов CRLF будет завышено. Я также предполагаю, что будет только пара CRLF, если строка имеет 72 символа. Это включает в себя последнюю строку, но не если она меньше 72 символов.

newline_size = ((code_padded_size) / 72) * 2

Итак, все вместе:

unsigned int code_padded_size = ((input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) ) / 3) * 4;
unsigned int newline_size = ((code_padded_size) / 72) * 2;

unsigned int total_size = code_padded_size + newline_size;

Или сделать его более читаемым:

unsigned int adjustment = ( (input_size % 3) ? (3 - (input_size % 3)) : 0);
unsigned int code_padded_size = ( (input_size + adjustment) / 3) * 4;
unsigned int newline_size = ((code_padded_size) / 72) * 2;

unsigned int total_size = code_padded_size + newline_size;

Ответ 3

Вот простая реализация C (без модулей и трехмерных операторов) для необработанного размера base64 (со стандартным "=" дополнением):

int output_size;
output_size = ((input_size - 1) / 3) * 4 + 4;

Для этого вам потребуется добавить дополнительные накладные расходы для CRLF, если это необходимо. Стандартное кодирование base64 (RFC 3548 или RFC 4648) позволяет разрывы строк CRLF (на 64 или 76 символов), но не требует этого. Вариант MIME (RFC 2045) требует разрыва строки после каждых 76 символов.

Например, общая закодированная длина с использованием 76 символьных строк, построенных выше:

int final_size;
final_size = output_size + (output_size / 76) * 2;

См. base64 wikipedia entry для большего количества вариантов.

Ответ 4

Просмотрите библиотеку b64. Функция b64_encode2() может дать максимальную оценку требуемого размера, если вы пройдете NULL, чтобы вы могли выделить память с уверенностью и затем снова вызовите передачу буфера и выполните преобразование.

Ответ 5

Я столкнулся с аналогичной ситуацией в python и с использованием codecs.iterencode(text, "base64" ) правильный расчет был:

adjustment = 3 - (input_size % 3) if (input_size % 3) else 0
code_padded_size = ( (input_size + adjustment) / 3) * 4
newline_size = ((code_padded_size) / 76) * 1
return code_padded_size + newline_size

Ответ 6

База 64 преобразует 3 байта в 4.

Если вы настроили биты не так много битов в 24 бита, вы должны выложить его так, чтобы он имел несколько 24 бит (3 байта).

Ответ 7

Я думаю, что эта формула должна работать:

b64len = (size * 8 + 5) / 6

Ответ 8

 if (inputSize == 0) return 0;

 int size = ((inputSize - 1) / 3) * 4 + 4;
 int nlines = (size - 1)/ maxLine + 1;
 return size + nlines * 2;

Эта формула добавляет завершающий CRLF (MIME, rfc2045) тогда и только тогда, когда последняя строка не соответствует точно максимальной длине строки.

Ответ 9

Фактическая длина двоичных данных, совместимых с базовым 64, совместимых с MIME, обычно составляет около 137% от исходной длины данных, хотя для очень коротких сообщений накладные расходы могут быть намного выше из-за накладных расходов заголовков. Очень грубо говоря, конечный размер двоичных данных с кодировкой base64 равен 1,37 раза по сравнению с исходным размером данных + 814 байтов (для заголовков).

Другими словами, вы можете приблизиться к размеру декодированных данных с помощью этой формулы:

BytesNeededForEncoding = (string_length(base_string) * 1.37) + 814;
BytesNeededForDecoding = (string_length(encoded_string) - 814) / 1.37;

Источник: http://en.wikipedia.org/wiki/Base64