web-dev-qa-db-fra.com

Base64 Java encoder et décoder une chaîne

Je veux encoder une chaîne en base64, la transférer via une socket et la décoder. Mais après le décodage, cela donne une réponse différente. Voici mon code et le résultat est "77 + 9x6s ="

import javax.xml.bind.DatatypeConverter;

    public class f{

       public static void main(String a[]){

          String str = new String(DatatypeConverter.parseBase64Binary("user:123"));
          String res = DatatypeConverter.printBase64Binary(str.getBytes());
          System.out.println(res);
       }
    }

Toute idée sur la façon de mettre en œuvre cela?

Merci...

143

Vous pouvez utiliser l'approche suivante:

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

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

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

J'espère que cela répond à votre doute.

215
Dark Knight

Java 8 prend désormais en charge l’encodage et le décodage BASE64. Vous pouvez utiliser les classes suivantes: Java.util.Base64, Java.util.Base64.Encoder et Java.util.Base64.Decoder.

Exemple d'utilisation:

// encode with padding
String encoded = Base64.getEncoder().encodeToString(someByteArray);

// encode without padding
String encoded = Base64.getEncoder().withoutPadding().encodeToString(someByteArray);

// decode a String
byte [] barr = Base64.getDecoder().decode(encoded); 
124
Lakshma Gopidi

Mise à jour pour Java 11:

import Java.util.Base64;

public class Base64Encoding {

    public static void main(String[] args) {
        Base64.Encoder enc = Base64.getEncoder();
        Base64.Decoder dec = Base64.getDecoder();
        String str = "77+9x6s=";

        // encode data using BASE64
        String encoded = enc.encodeToString(str.getBytes());
        System.out.println("encoded value is \t" + encoded);

        // Decode data
        String decoded = new String(dec.decode(encoded));
        System.out.println("decoded value is \t" + decoded);
        System.out.println("original value is \t" + str);
    }
}

La réponse acceptée utilise le package Apache Commons, mais voici comment je l'ai fait avec javax.xml.bind.DatatypeConverter - cela fonctionne à partir de Java 6 au moins:

import Java.io.UnsupportedEncodingException;    
import javax.xml.bind.DatatypeConverter;

public class EncodeString64 {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String str = "77+9x6s=";
        // encode data using BASE64
        String encoded = DatatypeConverter.printBase64Binary(str.getBytes());
        System.out.println("encoded value is \t" + encoded);

        // Decode data 
        String decoded = new String(DatatypeConverter.parseBase64Binary(encoded));
        System.out.println("decoded value is \t" + decoded);

        System.out.println("original value is \t" + str);
    }
}

Le meilleur moyen serait de try/catch les étapes d'encodage/décodage, mais j'espère que vous aurez l'idée.

49
nocdib

Pour les utilisateurs de Spring, Spring Security a une classe Base64 dans le package org.springframework.security.crypto.codec qui peut également être utilisée pour le codage et le décodage de Base64. Ex.

 public static String base64Encode(String token) {
    byte[] encodedBytes = Base64.encode(token.getBytes());
    return new String(encodedBytes, Charset.forName("UTF-8"));
}


public static String base64Decode(String token) {
    byte[] decodedBytes = Base64.decode(token.getBytes());
    return new String(decodedBytes, Charset.forName("UTF-8"));
}
23
iamiddy

Ce qui suit est une bonne solution -

import Android.util.Base64;

String converted = Base64.encodeToString(toConvert.toString().getBytes(), Base64.DEFAULT);

String stringFromBase = new String(Base64.decode(converted, Base64.DEFAULT));

C'est tout. Une seule ligne encodant et décodant.

18
Yehonatan
import javax.xml.bind.DatatypeConverter;

public class f{

   public static void main(String a[]){

      String str = new String(DatatypeConverter.printBase64Binary(new String("user:123").getBytes()));
      String res = DatatypeConverter.parseBase64Binary(str);
      System.out.println(res);
   }
}
7
Tahong Shen