Я прочитал следующая тема и нашел там эту формулу:
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?
С ceil это граница, а не точный результат. Это руководство, которое поможет в расчетах масштабирования.
22 символа: ** Base64.getEncoder (). EncodeToString ("1234567890123456789012" .getBytes ()) => * MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMg == (32 символа)
22 * 3/4 = 29,3333
@gstackoverflow 4*ceil(22/3) = 4*8 = 32.
@Bohemian А у вас есть пример, когда 4*ceil(n/3) не дает точного результата?
@lexicore, да, работает. Спасибо
@Kram Почему бы тебе не опубликовать это как ответ?




Попробуйте length = 4 * ((n / 3) + 1), где «/» - целочисленное деление.
Обновлено: Lexicore верен, моя формула не работает, когда остаток равен нулю.
int length = 4 * (n / 3);
if (n % 3 > 0) length++;
4*((n/3) + 1) дает 32 вместо n=21, тогда как правильный ответ - 28.
С 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 для 1 байта нужно 2 цифры (8 <= 12 бит), а для 2 байтов нужно 3 цифры (16 бит <= 18 бит).
4 * Math.ceil (16 / 3.0) == 20
4*Math.ceil(16 / 3.0) = 4 * ceil(5.333) = 4 * 6 = 24 Ceil облавливают.
вы правы, но как вы вычислили эту строку: ** 2 байта (16 бит) 3 цифры (18 бит) + " = " **?
Чтобы представить один байт (8 бит) цифрами, нужно 2 цифры, т.е. 6 бит = 12 бит. Одна цифра может представлять не более 6 бит полезной нагрузки. Из этих 12 бит свободны 4 бита: в действительности подойдет одна из 16 различных цифр. Но обычно свободные биты обнуляются.
Похоже, вы должны довести до потолка (n / 3). например - Ceil (8/3) = 3. Для вашего четвертого примера расчет будет - 4 * Ceil (8/3) = 4 * 3 = 12