Декодирование Base64 с использованием только JDK6
Этот вопрос в отношении JDK 5 говорит, что реализация JDK 5 отсутствует, но JDK 6 должен иметь sun.misc.Base64Decoder
.
Насколько я могу судить, этот класс не предоставляется JDK, и я не смог найти в нем какие-либо другие подобные классы
Итак, что такое ситуация с JDK6?
> Я знаю о многочисленных реализациях, таких как Commons и JBoss, но у нас есть ограничительная политика сторонних библиотек, поэтому я стараюсь не изобретать колесо.
Ответы
Ответ 1
Нет, ситуация не изменилась между Java 5 и Java 6.
К сожалению, официальная реализация Base64 на платформе Java SE отсутствует. @bestsss показал, что есть на самом деле (хорошо скрытая) реализация Base64 в Java SE 6 (см. Его ответ для более подробной информации).
Sun JDK поставляется с этим классом (sun.misc.Base64Decoder
), но он не указан и не должен использоваться (тем более, что он не требуется существовать в других реализациях или даже в версиях).
Если вам абсолютно необходимо избегать сторонних библиотек (Apache Commons Codec будет традиционным поставщиком реализация Base64), тогда вы можете скопировать BSD (или аналогичную) лицензионную версию в свой проект. Существует реализация общественного домена, и это примерно так же безболезненно, когда дело касается лицензий.
Ответ 2
В Java есть официальные (не sun.misc
) реализации, но это не тот, где кто-либо может быть.
java.util.prefs.AbstractPreferences
- это тот, который имеет необходимые методы для этого. Вы должны переопределить метод put
.
И еще один, который намного проще в использовании:
javax.xml.bind.DatatypeConverter
у него есть 2 метода, представляющих интерес:
разъяснение характера base64 AbstractPreferences:
java.util.prefs.Preferences
/**
* Associates a string representing the specified byte array with the
* specified key in this preference node. The associated string is
* the Base64 encoding of the byte array, as defined in RFC 2045, Section 6.8,
* with one minor change: the string will consist solely of characters
* from the Base64 Alphabet; it will not contain any newline
* characters. Note that the maximum length of the byte array is limited
* to three quarters of MAX_VALUE_LENGTH so that the length
* of the Base64 encoded String does not exceed MAX_VALUE_LENGTH.
* This method is intended for use in conjunction with
* {@link #getByteArray}.
*/
public abstract void putByteArray(String key, byte[] value);
Ответ 3
Как и Joachim Sauer, в предыдущем комментарии JDK1.6 уже поставляется вместе с собственной версией Base64 (sun.misc. *), вот пример:
String toEncode = "Encoding and Decoding in Base64 Test";
//Encoding in b64
String encoded = new BASE64Encoder().encode(toEncode.getBytes());
System.out.println(encoded);
//Decoding in b64
byte[] decodeResult = new BASE64Decoder().decodeBuffer(encoded);
System.out.println(new String(decodeResult));
Ответ 4
я использовал byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);
этот сайт хорошо объясняет: https://www.rgagnon.com/javadetails/java-0598.html
выдержка из этого:
public static String encode(String value) throws Exception {
return DatatypeConverter.printBase64Binary
(value.getBytes(StandardCharsets.UTF_8)); // use "utf-8" if java 6
}
public static String decode(String value) throws Exception {
byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);
return new String(decodedValue, StandardCharsets.UTF_8); // use "utf-8" if java 6
}