Как рассчитать длину строки в кодировке Base64?

Я прочитал следующая тема и нашел там эту формулу:

length = 4*(n/3)

Я начал тестировать:

1 символ: Base64.getEncoder().encodeToString("1".getBytes()) => MQ== (4 символа)

2 символа: Base64.getEncoder().encodeToString("12".getBytes()) => MTI= (4 символа)

5 символов: Base64.getEncoder().encodeToString("12345".getBytes()) => MTIzNDU= (8 символов)

8 символов: Base64.getEncoder().encodeToString("12345678".getBytes()) => MTIzNDU2Nzg= (12 символов)

21 символ: Base64.getEncoder().encodeToString("123456789012345678901".getBytes()) => MTIzNDU2Nzg5MDEyMzQ1Njc4OTAx (28 символов)

Похоже, эта формула не работает.

Не могли бы вы объяснить результаты mu?

Похоже, вы должны довести до потолка (n / 3). например - Ceil (8/3) = 3. Для вашего четвертого примера расчет будет - 4 * Ceil (8/3) = 4 * 3 = 12

Kram 03.04.2018 17:05

С ceil это граница, а не точный результат. Это руководство, которое поможет в расчетах масштабирования.

Bohemian 03.04.2018 17:06

22 символа: ** Base64.getEncoder (). EncodeToString ("1234567890123456789012‌" .getBytes ()) => * MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMg == (32 символа)

gstackoverflow 03.04.2018 17:10

22 * 3/4 ​​= 29,3333

gstackoverflow 03.04.2018 17:11

@gstackoverflow 4*ceil(22/3) = 4*8 = 32.

lexicore 03.04.2018 17:15

@Bohemian А у вас есть пример, когда 4*ceil(n/3) не дает точного результата?

lexicore 03.04.2018 17:18

@lexicore, да, работает. Спасибо

gstackoverflow 03.04.2018 17:24

@Kram Почему бы тебе не опубликовать это как ответ?

lexicore 03.04.2018 17:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
3 910
2

Ответы 2

Попробуйте length = 4 * ((n / 3) + 1), где «/» - целочисленное деление.

Обновлено: Lexicore верен, моя формула не работает, когда остаток равен нулю.

int length = 4 * (n / 3);
if (n % 3 > 0) length++;
4*((n/3) + 1) дает 32 вместо n=21, тогда как правильный ответ - 28.
lexicore 03.04.2018 17:37

С 64 цифрами (26) одна цифра может представлять 6 бит. Следовательно, 4 цифры могут представлять ровно 4 * 6 бит = 3 байта.

(Использование ÷ для явного целочисленного деления :)

Для n байтов необходимо 4 * (n ÷ 3) цифр плюс для остатка n% 3 (0 <3 байтов) необходимо от 0 до 4 цифр:

0 bytes (0 bits)    0 digits
1 byte  (8 bits)    2 digits (12 bits)     + "= = "
2 bytes (16 bits)   3 digits (18 bits)     + " = "

Часто используется дополнение до 4 цифр / символы заполнения с использованием =. Это не может быть 0, так как в этом случае можно добавить байт 0x0.

Тогда формула 4 * Math.ceil(n / 3.0).

Без заполнения: Math.ceil(n * 8 / 6.0) = Math.ceil(n * 4 / 3.0) = (n * 4 + (3 - 1)) ÷ 3.

В java следует использовать только деление int:

int base64Length(byte[] b) {
    int n = b.length;
    return (n * 4 + 2)/3;
}

Разобрался 4 * Math.ceil (n / 3.0). Бит не там, где брал (12 бит) и (18 бит)

gstackoverflow 03.04.2018 17:41

@gstackoverflow для 1 байта нужно 2 цифры (8 <= 12 бит), а для 2 байтов нужно 3 цифры (16 бит <= 18 бит).

Joop Eggen 03.04.2018 17:43

4 * Math.ceil (16 / 3.0) == 20

gstackoverflow 03.04.2018 17:47
4*Math.ceil(16 / 3.0) = 4 * ceil(5.333) = 4 * 6 = 24 Ceil облавливают.
Joop Eggen 03.04.2018 17:54

вы правы, но как вы вычислили эту строку: ** 2 байта (16 бит) 3 цифры (18 бит) + " = " **?

gstackoverflow 03.04.2018 18:02

Чтобы представить один байт (8 бит) цифрами, нужно 2 цифры, т.е. 6 бит = 12 бит. Одна цифра может представлять не более 6 бит полезной нагрузки. Из этих 12 бит свободны 4 бита: в действительности подойдет одна из 16 различных цифр. Но обычно свободные биты обнуляются.

Joop Eggen 03.04.2018 18:25

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