Подтвердить что ты не робот

Декодирование Base64 с использованием только JDK6

Этот вопрос в отношении JDK 5 говорит, что реализация JDK 5 отсутствует, но JDK 6 должен иметь sun.misc.Base64Decoder.

Насколько я могу судить, этот класс не предоставляется JDK, и я не смог найти в нем какие-либо другие подобные классы

Итак, что такое ситуация с JDK6?
> Я знаю о многочисленных реализациях, таких как Commons и JBoss, но у нас есть ограничительная политика сторонних библиотек, поэтому я стараюсь не изобретать колесо.

4b9b3361

Ответ 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
   }