1. Обзор
В этом руководстве мы рассмотрим различные утилиты, обеспечивающие функции кодирования и декодирования Base64 в Java.
В основном мы собираемся проиллюстрировать новые API Java 8. Кроме того, мы используем служебные API-интерфейсы Apache Commons.
2. Java 8 для базы 64
Java 8, наконец, добавила возможности Base64 в стандартный API через служебный класс java.util.Base64 .
Давайте начнем с рассмотрения основного процесса кодирования.
2.1. Базовая версия Java 8 Base64
Базовый кодировщик упрощает работу и кодирует ввод как есть, без разделения строк.
Кодер сопоставляет ввод с набором символов в наборе символов A-Za-z0-9+/
. Итак, декодер отбрасывает любые символы вне этого набора.
Давайте сначала закодируем простую строку
:
String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
Обратите внимание, как мы получаем полный API Encoder с помощью простого служебного метода getEncoder() .
Давайте теперь декодируем эту строку
обратно в исходную форму:
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
2.2. Кодирование Java 8 Base64 без заполнения
В кодировке Base64 длина закодированной на выходе строки
должна быть кратна трем. Кодер добавляет один или два символа заполнения ( =
) в конце вывода по мере необходимости, чтобы выполнить это требование.
После декодирования декодер отбрасывает эти дополнительные символы заполнения. Чтобы глубже изучить отступы в Base64, ознакомьтесь с этим подробным ответом на Stack Overflow .
Иногда нам нужно пропустить заполнение вывода . Например, результирующая строка
никогда не будет декодирована обратно. Итак, мы можем просто выбрать кодирование без заполнения :
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
:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
Основным API является класс org.apache.commons.codec.binary.Base64 .
Мы можем инициализировать его с помощью различных конструкторов:
Base64(boolean urlSafe)
создает API Base64, управляя безопасным режимом URL (вкл. или выкл.).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
в byte[]
. Самый простой способ — использовать метод 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));
Мы также можем использовать метод parseBase64Binary () DatatypeConverter
:
String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = DatatypeConverter.parseBase64Binary(originalInput);
assertEquals("test input", new String(result));
Наконец, мы можем преобразовать шестнадцатеричную строку
в byte[]
, используя метод DatatypeConverter.parseHexBinary
:
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
с printHexBinary
и parseBase64Binary
.
Фрагменты кода можно найти на GitHub .