web-dev-qa-db-fra.com

Décodage Base64 utilisant JDK6 uniquement

Cette question concernant JDK 5 dit, aucune implémentation n'est fournie avec JDK 5, mais JDK 6 est censé avoir un Sun.misc.Base64Decoder.

Pour autant que je sache, cette classe n'est pas fournie avec le JDK et je n'ai pu y trouver d'autres classes similaires

Alors, quelle est la situation avec JDK6?

.

24
kostja

Non, la situation n'a pas changé entre Java 5 et Java 6.

Malheureusement, il n'y a pas d'implémentation Base64 officielle dans la plate-forme Java SE. @bestsss a montré qu'il y a en fait une implémentation Base64 (bien cachée) dans Java SE 6 (voir sa réponse pour plus de détails).

Le Sun JDK est livré avec cette classe (Sun.misc.Base64Decoder), mais il n'est pas spécifié et ne doit pas être utilisé (d'autant plus qu'il n'est pas nécessaire qu'il existe dans d'autres implémentations ou même dans des versions).

Si vous devez absolument éviter les bibliothèques tierces ( Apache Commons Codec serait le fournisseur traditionnel de ne implémentation Base64 ), alors vous voudrez peut-être copier un BSD (ou similaire) version sous licence dans votre projet. Il y a implémentation du domaine public et c'est à peu près aussi indolore que possible, quand il s'agit de licences.

10
Joachim Sauer

Il existe des implémentations officielles (non Sun.misc) En Java, mais ce n'est pas là où l'on suppose être.

Java.util.prefs.AbstractPreferences Est celui qui a les méthodes nécessaires pour le faire. Vous devez remplacer la méthode put.

Et un de plus qui est beaucoup plus facile à utiliser:

javax.xml.bind.DatatypeConverter il a 2 méthodes d'intérêt:


clarification de la nature base64 de AbstractPreferences: Java.util.prefs.Preferences

 /**
 * Associe une chaîne représentant le tableau d'octets spécifié à la clé spécifiée 
 * Dans ce nœud de préférence. La chaîne associée est 
 * Le Base64 codage du tableau d'octets, tel que défini dans RFC 2045, Section 6.8, 
 * avec une modification mineure: la chaîne sera uniquement composée de caractères 
 * de la Alphabet Base64; il ne contiendra aucun caractère de nouvelle ligne 
 *. Notez que la longueur maximale du tableau d'octets est limitée 
 * Aux trois quarts de MAX_VALUE_LENGTH afin que la longueur 
 * De la chaîne codée Base64 ne dépasse pas MAX_VALUE_LENGTH. 
 * Cette méthode est destiné à être utilisé conjointement avec 
 * {@link #getByteArray}. 
 */
 public abstract void putByteArray (String key, byte [] value); 
55
bestsss

Tout comme Joachim Sauer l'a dit dans un commentaire précédent, JDK1.6 est déjà livré avec sa propre implémentation Base64 (Sun.misc. *), Voici un exemple:

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));
7
Marco

j'ai utilisé byte[] decodedValue = DatatypeConverter.parseBase64Binary(value);

ce site Web explique bien: https://www.rgagnon.com/javadetails/Java-0598.html

extrait:

   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
   }
4
Shimon Doodkin