декодирование строки base64 и перекодирование возвращенных байтов не возвращает ту же строку - PullRequest
0 голосов
/ 21 октября 2018

Я делаю простое декодирование строки base64.Когда я перекодирую, я не получаю ту же строку обратно.Чего мне не хватает?

String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";
byte[] decoded = Base64.getDecoder().decode(base64.getBytes());
String encoded = Base64.getEncoder().encodeToString(decoded);

Вы видите, что строка encoded не совпадает со строкой ввода base64:

R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=

enter image description here

1 Ответ

0 голосов
/ 21 октября 2018

Base64 кодирует 3 байта (3 * 8 = 24 бита) в 4 символа, выбирая из 64 (6 бит) отображаемых символов (4 * 6 = 24бит) .См. Википедия для подробного описания того, как это работает.

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

R3df 789G Sfsb 2edf SFSD Fuik uikk 2349 GSfs b2ed fSvF SDFR 3df7 89GS fsb2 edf

Как видите, это 15 блоков по 4 символа и последний блок только из 3 символов.3 символа (3 * 6 = 18 бит) может хранить 2 байта (2 * 8 = 16 бит) , оставляя 2 неиспользованных бита.Эти 2 бита могут иметь любое значение, поскольку они не используются, но стандарт для таких дополнительных битов должен быть установлен на 0.

Ваш вход от закодированного Base64, который решил установитьдополнительные биты равны 1, поэтому последний символ равен f, а не стандартным c.

Также довольно часто, хотя и не всегда, требуется дополнить закодированный текст полными блоками, добавив 1 или2 = знаков в конце.Таким образом, при стандартном использовании 0 для дополнительных битов и добавлении заполнения, последний блок становится edc=, но он декодируется в те же байты, что и нестандартный последний блок edf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...