Вопрос-ответ

Decode Base64 data in Java

Декодирование данных Base64 в Java

У меня есть изображение в кодировке Base64. Каков наилучший способ декодирования этого в Java? Надеюсь, используя только библиотеки, входящие в состав Sun Java 6.

Переведено автоматически
Ответ 1

Начиная с Java 8, существует официально поддерживаемый API для кодирования и декодирования Base64. Со временем это, вероятно, станет выбором по умолчанию.

API включает в себя класс java.util.Base64 и вложенные в него классы. Он поддерживает три различных варианта: basic, URL safe и MIME.

Пример кода с использованием "базовой" кодировки:

import java.util.Base64;

byte[] bytes = "Hello, World!".getBytes("UTF-8");
String encoded = Base64.getEncoder().encodeToString(bytes);
byte[] decoded = Base64.getDecoder().decode(encoded);
String decodedStr = new String(decoded, StandardCharsets.UTF_8);

Документация для java.util.Base64 включает в себя еще несколько методов для настройки кодеров и декодеров, а также для использования различных классов в качестве входных и выходных данных (массивы байтов, строки, байт-буферы, java.io потоки).

Ответ 2

Начиная с версии 6, Java SE поставляется с JAXB. javax.xml.bind.DatatypeConverter имеет статические методы, которые упрощают это. Смотрите parseBase64Binary() и printBase64Binary().

ОБНОВЛЕНИЕ: JAXB больше не поставляется с Java (начиная с Java 11). Если для вашего проекта требуется JAXB, вам нужно будет настроить соответствующие библиотеки через вашу систему управления зависимостями, например Maven. Если вам требуется компилятор (xjc.exe), вам также необходимо загрузить его отдельно.

Ответ 3

Нет необходимости использовать commons - Sun поставляет кодировщик base64 с Java. Вы можете импортировать его как таковой:

import sun.misc.BASE64Decoder;

А затем используйте их следующим образом:

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);

Где encodedBytes это либо java.lang.String, либо a java.io.InputStream. Просто помните, что sun.* классы не "официально поддерживаются" Sun.

РЕДАКТИРОВАТЬ: Кто знал, что это будет самый противоречивый ответ, который я когда-либо публиковал? Я точно знаю, что пакеты sun. * не поддерживаются и их существование не гарантируется, и я знаю о Commons и использую его постоянно. Однако в постере был запрошен класс, который был "включен в Sun Java 6", и это то, на что я пытался ответить. Я согласен, что Commons - лучший способ в целом.

ПРАВКА 2: Как указывает amir75 ниже, Java 6 + поставляется с JAXB, который содержит поддерживаемый код для кодирования / декодирования Base64. Пожалуйста, ознакомьтесь с ответом Джереми Росса ниже.

Ответ 4

В частности, в кодеке Commons: class Base64 в decode(byte[] array) или encode(byte[] array)

java