Encodage Base64 en Java

J'utilise Eclipse. J'ai la ligne de code suivante:

wr.write(new sun.misc.BASE64Encoder().encode(buf));

Eclipse marque cette ligne comme une erreur. J'ai importé les bibliothèques nécessaires:

import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

mais encore une fois, les deux sont présentés comme des erreurs. J'ai trouvé un poste similaire ici .

J'ai utilisé Apache Commons comme solution suggérée en incluant:

import org.apache.commons.*;

et l'importation des fichiers JAR téléchargés de: http://commons.apache.org/codec /

Mais le problème existe toujours. Eclipse montre toujours les erreurs précédemment mentionnées; veuillez nous en informer.

252
demandé sur dda 2012-10-28 18:21:17

16 réponses

vous devez changer l'importation de votre classe:

import org.apache.commons.codec.binary.Base64;

et ensuite changer votre classe pour utiliser la classe Base64.

voici un exemple de code:

byte[] encodedBytes = Base64.encodeBase64("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));

puis pourquoi ne pas utiliser sun.* les forfaits .


mise à Jour (16/12/2016)

vous pouvez maintenant java.util.Base64 avec Java8. Tout d'abord, l'importer comme vous le faites habituellement do:

import java.util.Base64;

utiliser ensuite les méthodes statiques Base64 comme suit:

byte[] encodedBytes = Base64.getEncoder().encode("Test".getBytes());
System.out.println("encodedBytes " + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println("decodedBytes " + new String(decodedBytes));

voir Javadocs pour Base64 pour plus d'informations: https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html

507
répondu Frank 2017-11-13 18:52:59

Utilisation de Java 8-jamais-trop-tard-pour-rejoindre-dans-le-fun classe: java.util.Base64

203
répondu bratan 2014-04-30 12:15:33

vous pouvez également convertir en utilisant l'encodage base64. Pour ce faire, vous pouvez utiliser javax.xml.bind.DatatypeConverter#printBase64Binary méthode

par exemple:

byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
System.out.println(DatatypeConverter.printBase64Binary(salt));
64
répondu stinepike 2016-06-13 17:59:10

en Java 8 Il peut être fait comme

Base64.getEncoder().encodeToString(string.getBytes(StandardCharsets.UTF_8))

voici un exemple complet, court et complet

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Temp {
    public static void main(String... args) throws Exception {
        final String s = "old crow medicine show";
        final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8);
        final String encoded = Base64.getEncoder().encodeToString(authBytes);
        System.out.println(s + " => " + encoded);
    }
}

donne la sortie

old crow medicine show => b2xkIGNyb3cgbWVkaWNpbmUgc2hvdw==
55
répondu Kirby 2015-12-03 16:46:33

Google Guava est un bon choix pour encoder et décoder des données base64:

POM config:

<dependency>
   <artifactId>guava</artifactId>
   <groupId>com.google.guava</groupId>
   <type>jar</type>
   <version>14.0.1</version>
</dependency>

code échantillon:

String inputContent = "Hello Việt Nam";
String base64String = BaseEncoding.base64().encode(inputContent.getBytes("UTF-8"));
//decode
System.out.println("Base64:" + base64String);//SGVsbG8gVmnhu4d0IE5hbQ==
byte[] contentInBytes = BaseEncoding.base64().decode(base64String);
System.out.println("Source content: " + new String(contentInBytes, "UTF-8"));//Hello Việt Nam
18
répondu ThoQ 2015-02-10 10:35:48

Eclipse vous donne une erreur/avertissement parce que vous essayez d'utiliser des classes internes qui sont spécifiques à un fournisseur JDK et ne font pas partie de l'API publique. Jakarta Commons fournit sa propre implémentation des codecs base64, qui résident bien sûr dans un paquet différent. Supprimez ces importations et laissez Eclipse importer les classes Commons appropriées pour vous.

8
répondu Marko Topolnik 2012-10-28 14:26:27

pour convertir ce que vous avez besoin Encoder & décoder que vous obtiendrez de http://www.source-code.biz/base64coder/java / . Il S'agit du fichier Base64Coder.java vous aurez besoin.

maintenant pour accéder à cette classe comme vous l'avez besoin de la classe ci-dessous:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Base64 {

 public static void main(String args[]) throws IOException {
  /*
   * if (args.length != 2) {System.out.println(
   * "Command line parameters: inputFileName outputFileName");
   * System.exit(9); } encodeFile(args[0], args[1]);
   */
  File sourceImage = new File("back3.png");
  File sourceImage64 = new File("back3.txt");
  File destImage = new File("back4.png");
  encodeFile(sourceImage, sourceImage64);
  decodeFile(sourceImage64, destImage);
 }

 private static void encodeFile(File inputFile, File outputFile) throws IOException {
  BufferedInputStream in = null;
  BufferedWriter out = null;
  try {
   in = new BufferedInputStream(new FileInputStream(inputFile));
   out = new BufferedWriter(new FileWriter(outputFile));
   encodeStream(in, out);
   out.flush();
  } finally {
   if (in != null)
    in.close();
   if (out != null)
    out.close();
  }
 }

 private static void encodeStream(InputStream in, BufferedWriter out) throws IOException {
  int lineLength = 72;
  byte[] buf = new byte[lineLength / 4 * 3];
  while (true) {
   int len = in.read(buf);
   if (len &lt;= 0)
    break;
   out.write(Base64Coder.encode(buf, 0, len));
   out.newLine();
  }
 }

 static String encodeArray(byte[] in) throws IOException {
  StringBuffer out = new StringBuffer();
  out.append(Base64Coder.encode(in, 0, in.length));
  return out.toString();
 }

 static byte[] decodeArray(String in) throws IOException {
  byte[] buf = Base64Coder.decodeLines(in);
  return buf;
 }

 private static void decodeFile(File inputFile, File outputFile) throws IOException {
  BufferedReader in = null;
  BufferedOutputStream out = null;
  try {
   in = new BufferedReader(new FileReader(inputFile));
   out = new BufferedOutputStream(new FileOutputStream(outputFile));
   decodeStream(in, out);
   out.flush();
  } finally {
   if (in != null)
    in.close();
   if (out != null)
    out.close();
  }
 }

 private static void decodeStream(BufferedReader in, OutputStream out) throws IOException {
  while (true) {
   String s = in.readLine();
   if (s == null)
    break;
   byte[] buf = Base64Coder.decodeLines(s);
   out.write(buf);
  }
 }
}

dans Android, vous pouvez convertir votre Bitmap en Base64 pour le téléchargement vers le serveur/Service Web.

Bitmap bmImage = //Data
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageData = baos.toByteArray();
String encodedImage = Base64.encodeArray(imageData);

Ce "encodedImage" est une représentation textuelle de votre Image. Vous pouvez l'utiliser soit pour télécharger objet ou pour envoyer directement dans la Page HTML comme ci-dessous ( référence ):

<img alt="" src="data:image/png;base64,<?php echo $encodedImage; ?>" width="100px" />
<img alt="" src="data:image/png;base64,/9j/4AAQ...........1f/9k=" width="100px" />

Documentation: http://dwij.co.in/java-base64-image-encoder

7
répondu Web Developer in Pune 2013-12-20 18:24:35

pour java 6-7 la meilleure option est d'emprunter le code du dépôt Android. Il n'a pas de dépendances.

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Base64.java

6
répondu Alexey Zakharov 2015-06-13 00:24:45

apache commons a une belle implémentation de base64. vous pouvez le faire aussi simplement que

// encrypt data on your side using BASE64
byte[]   bytesEncoded = Base64.encodeBase64(str .getBytes());
System.out.println("ecncoded value is " + new String(bytesEncoded ));

// Decrypt data on other side, by processing encoded data
byte[] valueDecoded= Base64.decodeBase64(bytesEncoded );
System.out.println("Decoded value is " + new String(valueDecoded));

vous pouvez trouver plus de détails sur l'encodage base64 à http://faisalbhagat.blogspot.com/2014/06/base64-encoding-using-java-and.html

5
répondu faisalbhagat 2014-06-06 11:15:03

Voici mes deux cents... Java 8 contient sa propre implémentation de Base64 . Cependant, j'ai trouvé une différence un peu troublante. Pour illustrer, je vais donner un exemple de code:

mon CODEC wrapper:

public interface MyCodec
{
  static String apacheDecode(String encodedStr)
  {
     return new String(Base64.decodeBase64(encodedStr), Charset.forName("UTF-8"));
  }

  static String apacheEncode(String decodedStr)
  {
      byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
      return Base64.encodeBase64String(decodedByteArr);
  }

  static String javaDecode(String encodedStr)
  {
      return new String(java.util.Base64.getDecoder().decode(encodedStr), Charset.forName("UTF-8"));
  }

  static String javaEncode(String decodedStr)
  {
    byte[] decodedByteArr = decodedStr.getBytes(Charset.forName("UTF-8"));
    return java.util.Base64.getEncoder().encodeToString(decodedByteArr);
  }
}

Classe D'Essai:

public class CodecDemo
{
  public static void main(String[] args)
  {
    String decodedText = "Hello World!";

    String encodedApacheText = MyCodec.apacheEncode(decodedText);
    String encodedJavaText = MyCodec.javaEncode(decodedText);

    System.out.println("Apache encoded text: " + MyCodec.apacheEncode(encodedApacheText));
    System.out.println("Java encoded text: " + MyCodec.javaEncode(encodedJavaText));

    System.out.println("Encoded results equal: " + encodedApacheText.equals(encodedJavaText));

    System.out.println("Apache decode Java: " + MyCodec.apacheDecode(encodedJavaText));
    System.out.println("Java decode Java: " + MyCodec.javaDecode(encodedJavaText));

    System.out.println("Apache decode Apache: " + MyCodec.apacheDecode(encodedApacheText));
    System.out.println("Java decode Apache: " + MyCodec.javaDecode(encodedApacheText));
  }
}

sortie:

Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA0K

Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: false
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character d
    at java.util.Base64$Decoder.decode0(Base64.java:714)
    at java.util.Base64$Decoder.decode(Base64.java:526)
    at java.util.Base64$Decoder.decode(Base64.java:549)

notez que L'Apache le texte encodé contient des sauts de ligne supplémentaires (espaces blancs) à la fin. Par conséquent, pour que mon CODEC produise le même résultat quelle que soit L'implémentation de Base64, j'ai dû appeler trim() sur le texte encodé D'Apache. Dans mon cas, j'ai simplement ajouté l'appel de méthode ci-dessus à mon CODEC apacheDecode() comme suit:

return Base64.encodeBase64String(decodedByteArr).trim();

une fois que ce changement a été fait, les résultats sont ce que je m'attendais à commencer par:

Apache encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Java encoded text: U0dWc2JHOGdWMjl5YkdRaA==
Encoded results equal: true
Apache decode Java: Hello World!
Java decode Java: Hello World!
Apache decode Apache: Hello World!
Java decode Apache: Hello World!

peut-être quelqu'un pourrait nous dire pourquoi, mais j'ai trouvé ma solution de contournement comme un compromis acceptable.

5
répondu hfontanez 2018-01-05 15:11:03

sur Android, Utilisez les méthodes statiques du android.util.Base64 utilitaire de la classe. La documentation référencée indique que la classe Base64 a été ajoutée au niveau 8 de L'API (Froyo).

import android.util.Base64;

byte[] encodedBytes = Base64.encode("Test".getBytes());
Log.d("tag", "encodedBytes " + new String(encodedBytes));

byte[] decodedBytes = Base64.decode(encodedBytes);
Log.d("tag", "decodedBytes " + new String(decodedBytes));
4
répondu Yojimbo 2017-09-18 17:44:16

exemple Simple avec Java 8:

import java.util.Base64;

String str = "your string";
String encodedStr = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
3
répondu z3d0 2015-11-15 20:27:40

si vous utilisez Spring framework au moins la version 4.1, vous pouvez utiliser org.springframework.util.Base64Utils classe:

byte[] raw = { 1, 2, 3 };
String encoded = Base64Utils.encodeToString(raw);
byte[] decoded = Base64Utils.decodeFromString(encoded);

il déléguera à Java 8 Base64, Apache Commons Codec ou JAXB DatatypeConverter, selon ce qui est disponible.

3
répondu holmis83 2016-08-19 12:23:30

si vous êtes collé à une version antérieure de Java than 8 mais que vous utilisez déjà AWS SDK pour Java , vous pouvez utiliser com.amazonaws.util.Base64 .

2
répondu auselen 2016-08-12 11:59:00

en Java 7 j'ai codé cette méthode

import javax.xml.bind.DatatypeConverter;

public static String toBase64(String data) {
    return DatatypeConverter.printBase64Binary(data.getBytes());
}
1
répondu Daniel De León 2016-03-14 17:48:56

j'ai essayé avec le code suivant. Il a bien fonctionné. :- )

com.sun.org.apache.xml.internal.security.utils.Base64.encode("The string to encode goes here");
0
répondu tmh 2015-03-04 12:27:09