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.