Перейти к основному содержимому

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

· 5 мин. чтения

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 .