Декодирование Base64 с использованием только JDK6 - PullRequest
21 голосов
/ 06 мая 2011

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

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

Итак, какова ситуация с JDK6?

Мне известны многочисленные реализации, такие как Commons и JBoss, но у нас есть ограничительная сторонняя политика lib, поэтому я стараюсь не изобретать колесо заново.

Ответы [ 4 ]

55 голосов
/ 06 мая 2011

Существуют официальные (не sun.misc) реализации на Java, но это не то, где кто-либо предполагает.

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 <i>Base64</i> 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 <i>Base64 Alphabet</i>; 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);
10 голосов
/ 06 мая 2011

Нет, ситуация не изменилась между Java 5 и Java 6.

К сожалению, в платформе Java SE нет официальной реализации Base64. @bestsss показал, что - это на самом деле (хорошо скрытая) реализация Base64 в Java SE 6 ( см. его ответ для более подробной информации).

Sun JDK поставляется с этим классом (sun.misc.Base64Decoder), но он не указан и не должен использоваться (тем более, что он не требуется для существования в других реализациях или даже версиях).

Если вам абсолютно необходимо избегать сторонних библиотек ( Кодек Apache Commons будет традиционным поставщиком реализации Base64 ), то вы можете скопировать BSD (или аналогично ) лицензионная версия в ваш проект. Существует реализация общественного достояния , и это примерно так же безболезненно, как и в случае лицензий.

5 голосов
/ 07 июля 2016

Точно так же, как сказал Йоахим Зауэр в предыдущем комментарии, 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));
1 голос
/ 25 июня 2019

я использовал 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
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...