Рубрики
Без рубрики

Кодирование и декодирование Java Base64

Как сделать кодирование и декодирование Base64 в Java, используя новые API, представленные в Java 8, а также Apache Commons.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы рассмотрим различные утилиты, которые предоставляют функции кодирования и декодирования Base64 в Java.

Мы в основном собираемся проиллюстрировать новые API Java 8 и служебные API, которые выходят из Apache Commons.

Дальнейшее чтение:

Руководство по кодированию/декодированию URL-адресов Java

Хеширование SHA-256 и SHA3-256 в Java

Новое Хранилище Паролей В Spring Security 5

2. Java 8 для базы 64

Java 8 наконец-то добавила возможности Base64 в стандартный API. Это делается через класс утилиты java.util.Base64 .

Давайте начнем с рассмотрения базового процесса кодирования.

2.1. Java 8 Basic Base64

Базовый кодер упрощает работу и кодирует вход как есть, без какого-либо разделения строк.

Выходные данные отображаются на набор символов в A-Za-z0-9+/ набор символов, и декодер отклоняет любой символ за пределами этого набора.

Давайте сначала закодируем простую строку :

String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());

Обратите внимание, как мы получаем полный API кодировщика с помощью простого метода GetEncoder() utility.

Теперь давайте расшифруем эту строку обратно в исходную форму:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

2.2. Кодировка Java 8 Base64 Без Заполнения

В кодировке Base64 длина выходной кодированной строки должна быть кратна трем. Если нет, то вывод будет дополнен дополнительными символами pad ( = ).

После декодирования эти дополнительные символы заполнения будут отброшены. Чтобы углубиться в заполнение в Base64, ознакомьтесь с этим подробным ответом на Переполнение стека .

Если нам нужно пропустить заполнение вывода — возможно, потому, что результирующая строка никогда не будет декодирована обратно — мы можем просто выбрать кодирование без заполнения :

String encodedString = 
  Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());

2.3. Кодировка URL-адресов Java 8

Кодировка URL-адресов очень похожа на базовый кодер, который мы рассмотрели выше. Он использует безопасный алфавит Base64 URL и имени файла и не добавляет никакого разделения строк:

String originalUrl = "https://www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java";
String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes());

Декодирование происходит во многом таким же образом. Метод утилиты getUrlDecoder() возвращает java.util.Base64.Decoder , который затем используется для декодирования URL-адреса:

byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);

2.4. Кодировка MIME Java 8

Давайте начнем с создания некоторого базового ввода MIME для кодирования:

private static StringBuilder getMimeBuffer() {
    StringBuilder buffer = new StringBuilder();
    for (int count = 0; count < 10; ++count) {
        buffer.append(UUID.randomUUID().toString());
    }
    return buffer;
}

Кодер MIME генерирует выходные данные в кодировке Base64, используя базовый алфавит, но в удобном для MIME формате.

Каждая строка вывода содержит не более 76 символов и заканчивается возвратом каретки, за которым следует перевод строки ( \r\n ):

StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);

Метод утилиты getMimeDecoder() возвращает java.util.Base64.Decoder , который затем используется в процессе декодирования:

byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);

3. Кодирование/Декодирование С Использованием Кодека Apache Commons

Во-первых, нам нужно определить зависимость commons-codec в pom.xml :


    commons-codec
    commons-codec
    1.10

Обратите внимание, что мы можем проверить, были ли выпущены более новые версии библиотеки на Maven Central .

Основным API является класс org.apache.commons.codec.binary.Base64 , который может быть параметризован с помощью различных конструкторов:

  • Base64(boolean urlSafe) создает API Base64, управляя включенным или выключенным режимом URL-safe.
  • Base64 (int lineLength) создает API Base64 в небезопасном для URL режиме и управляет длиной строки (по умолчанию 76).
  • Base64(int lineLength, byte[] LineSeparator) создает API Base64, принимая дополнительный разделитель строк, который по умолчанию является CRLF (“\r\n”).

После создания API Base64 и кодирование, и декодирование довольно просты:

String originalInput = "test input";
Base64 base64 = new Base64();
String encodedString = new String(base64.encode(originalInput.getBytes()));

Метод decode() класса Base64 возвращает декодированную строку:

String decodedString = new String(base64.decode(encodedString.getBytes()));

Другим простым вариантом является использование статического API Base64 |/вместо создания экземпляра:

String originalInput = "test input";
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));

4. Преобразование строки в массив байтов

Иногда нам нужно преобразовать Строку в байт[] . Самый простой способ сделать это-использовать метод String getBytes() :

String originalInput = "test input";
byte[] result = originalInput.getBytes();

assertEquals(originalInput.length(), result.length);

Лучше также обеспечить кодировку и не зависеть от кодировки по умолчанию, так как она зависит от системы:

String originalInput = "test input";
byte[] result = originalInput.getBytes(StandardCharsets.UTF_16);

assertTrue(originalInput.length() < result.length);

Если наша строка Base64 закодирована, мы можем использовать декодер Base64 |:

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = Base64.getDecoder().decode(originalInput);

assertEquals("test input", new String(result));

Мы также можем использовать DatatypeConverter parseBase64Binary() метод :

String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = DatatypeConverter.parseBase64Binary(originalInput);

assertEquals("test input", new String(result));

Наконец, мы можем преобразовать шестнадцатеричную строку в байт[] с помощью метода DatatypeConverter :

String originalInput = "7465737420696E707574";
byte[] result = DatatypeConverter.parseHexBinary(originalInput);

assertEquals("test input", new String(result));

5. Заключение

В этой статье объясняются основы кодирования и декодирования Base64 в Java с использованием новых API, представленных в Java 8 и Apache Commons.

Наконец, стоит упомянуть несколько других API, которые предоставляют аналогичную функциональность: java.xml.bind.DataTypeConverter с printexbinary и parseBase64Binary .

Фрагменты кода можно найти на GitHub.