Exemple de code d'encodage et de décodage Base 64

215

Est-ce que quelqu'un sait comment décoder et encoder une chaîne en Base64 à l'aide de Base64. J'utilise le code suivant, mais cela ne fonctionne pas.

String source = "password"; 
byte[] byteArray = source.getBytes("UTF-16"); 
Base64 bs = new Base64(); 
//bs.encodeBytes(byteArray); 
System.out.println( bs.encodeBytes(byteArray)); 
//bs.decode(bs.encodeBytes(byteArray));
System.out.println(bs.decode(bs.encodeBytes(byteArray)));
max
la source
1
Vous devez importer ceci import android.util.Base64;et ensuite utiliser Base64.encodeToStringet Base64.decodeselon vos besoins
Zohab Ali

Réponses:

490

Première:

  • Choisissez un encodage. UTF-8 est généralement un bon choix; s'en tenir à un encodage qui sera certainement valable des deux côtés. Il serait rare d'utiliser autre chose que UTF-8 ou UTF-16.

Fin de transmission:

  • Encode la chaîne en octets (par exemple text.getBytes(encodingName))
  • Encode les octets en base64 à l'aide de la Base64classe
  • Transmettez la base64

Destinataire:

  • Recevez le base64
  • Décode le base64 en octets à l'aide de la Base64classe
  • Décode les octets en une chaîne (par exemple new String(bytes, encodingName))

Donc quelque chose comme:

// Sending side
byte[] data = text.getBytes("UTF-8");
String base64 = Base64.encodeToString(data, Base64.DEFAULT);

// Receiving side
byte[] data = Base64.decode(base64, Base64.DEFAULT);
String text = new String(data, "UTF-8");

Ou avec StandardCharsets:

// Sending side
byte[] data = text.getBytes(StandardCharsets.UTF_8);
String base64 = Base64.encodeToString(data, Base64.DEFAULT);

// Receiving side
byte[] data = Base64.decode(base64, Base64.DEFAULT);
String text = new String(data, StandardCharsets.UTF_8);
Jon Skeet
la source
pouvez-vous me donner le code exact qui serait d'une grande aide. j'utilise mais ça ne fonctionne pas. String source = "mot de passe"; byte [] byteArray = source.getBytes ("UTF-16"); Base64 bs = nouveau Base64 (); //bs.encodeBytes(byteArray); System.out.println (bs.encodeBytes (byteArray)); //bs.decode(bs.encodeBytes(byteArray)); System.out.println (bs.decode (bs.encodeBytes (byteArray)));
max
9
@max: "Ça ne marche pas" n'est jamais une bonne description de ce qui se passe. Modifie cependant mon message.
Jon Skeet
3
Notez également que vous ne devez pas appeler des méthodes statiques comme s'il s'agissait de méthodes d'instance ...
Jon Skeet
3
si vous le mettez comme ça, cela fonctionnera String base64 = Base64.encodeToString (data, Base64.NO_WRAP);
Joy
1
@portfoliobuilder: Absolument pas. UTF-8est garanti d'être un encodage valide en Java: voir docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html . Certes, ces jours-ci, je préciserais StandardCharsets.UTF_8plutôt. J'ai mis à jour la réponse pour spécifier que vous devez avoir confiance en la présence du jeu de caractères, mais j'utiliserais presque toujours UTF-8.
Jon Skeet
18

Pour toute autre personne qui s'est retrouvée ici en cherchant des informations sur la façon de décoder une chaîne encodée avec Base64.encodeBytes(), voici ma solution:

// encode
String ps = "techPass";
String tmp = Base64.encodeBytes(ps.getBytes());

// decode
String ps2 = "dGVjaFBhC3M=";
byte[] tmp2 = Base64.decode(ps2); 
String val2 = new String(tmp2, "UTF-8"); 

En outre, je prends en charge les anciennes versions d'Android, j'utilise donc la bibliothèque Base64 de Robert Harder à partir de http://iharder.net/base64

Dunfield
la source
10

Pour Kotlin mb mieux utiliser ceci:

fun String.decode(): String {
    return Base64.decode(this, Base64.DEFAULT).toString(charset("UTF-8"))
}

fun String.encode(): String {
    return Base64.encodeToString(this.toByteArray(charset("UTF-8")), Base64.DEFAULT)
}

Exemple:

Log.d("LOGIN", "TEST")
Log.d("LOGIN", "TEST".encode())
Log.d("LOGIN", "TEST".encode().decode())
brunql
la source
1
Nommer ces fonctions d'extensions est horrible. Je recommande fortement d'utiliser encodeToBase64 ou quelque chose de similaire.
Rolf ツ
Ils ne sont absolument pas clairs et évidents. Dites-moi: que signifie "décoder" ou "coder"? Il existe des milliers d'algorithmes de décodage / encodage ... Et si vous avez besoin de Base64 et Hex? Comment nommeriez-vous les méthodes alors?
Rolf
Sans parler des différents standards Base64.
Rolf
Clair et évident pour ce cas d'utilisation. Si j'ai besoin d'un autre algorithme, je ne l'utiliserai jamais comme méthode d'extension.
brunql
1
Néanmoins, je préférerais quelque chose comme: «toBase64 ()» et «fromBase64 ()» au minimum. De cette façon, je n'ai pas besoin de lire de documentation pour savoir ce que fera la méthode. Gardez à l'esprit: "le code est lu plus qu'il n'est écrit".
Rolf
8

Si vous utilisez Kotlin, utilisez comme ceci

Pour encoder

val password = "Here Your String"
val data = password.toByteArray(charset("UTF-8"))
val base64 = Base64.encodeToString(data, Base64.DEFAULT)

Pour décoder

val datasd = Base64.decode(base64, Base64.DEFAULT)
val text = String(datasd, charset("UTF-8"))
Mohit Suthar
la source
3
Ou vous pouvez utiliser Charsets.UTF_8 au lieu de charset ("UTF-8").
makovkastar
@makovkastar vient de confirmer, maintenant StandardCharsets.UTF_8
Matt
7

quelque chose comme

String source = "password"; 
byte[] byteArray;
try {
    byteArray = source.getBytes("UTF-16");
    System.out.println(new String(Base64.decode(Base64.encode(byteArray,
           Base64.DEFAULT), Base64.DEFAULT)));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
DonGru
la source
5
Votre réponse implique que le codage des mots de passe en base64 est une bonne pratique. En fait, ce n'est PAS comme n'importe qui peut simplement le décoder.
Heinrich
2

Pour chiffrer:

byte[] encrpt= text.getBytes("UTF-8");
String base64 = Base64.encodeToString(encrpt, Base64.DEFAULT);

Pour décrypter:

byte[] decrypt= Base64.decode(base64, Base64.DEFAULT);
String text = new String(decrypt, "UTF-8");
Communauté
la source
1

Sur la base des réponses précédentes, j'utilise les méthodes utilitaires suivantes au cas où quelqu'un voudrait l'utiliser.

    /**
 * @param message the message to be encoded
 *
 * @return the enooded from of the message
 */
public static String toBase64(String message) {
    byte[] data;
    try {
        data = message.getBytes("UTF-8");
        String base64Sms = Base64.encodeToString(data, Base64.DEFAULT);
        return base64Sms;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return null;
}

/**
 * @param message the encoded message
 *
 * @return the decoded message
 */
public static String fromBase64(String message) {
    byte[] data = Base64.decode(message, Base64.DEFAULT);
    try {
        return new String(data, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return null;
}
Szabolcs Becze
la source
0

La classe 'java.util.Base64' fournit des fonctionnalités pour encoder et décoder les informations au format Base64.

Comment obtenir l'encodeur Base64?

Encoder encoder = Base64.getEncoder();

Comment obtenir le décodeur Base64?

Decoder decoder = Base64.getDecoder();

Comment encoder les données?

Encoder encoder = Base64.getEncoder();
String originalData = "java";
byte[] encodedBytes = encoder.encode(originalData.getBytes());

Comment décoder les données?

Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encodedBytes);
String decodedStr = new String(decodedBytes);

Vous pouvez obtenir plus de détails sur ce lien .

Hari Krishna
la source
-1
    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".BaseActivity">
   <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/edt"
       android:paddingTop="30dp"
       />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv1"
        android:text="Encode"
        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv2"

        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv3"
        android:text="decode"
        android:textSize="20dp"
        android:padding="20dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv4"
        android:textSize="20dp"
        android:padding="20dp"


        />
</LinearLayout>
Asif Ali
la source
c'est pour encoder et dcoder via base64 dans le studio android
Asif Ali
Veuillez mettre à jour votre commentaire en réponse. Publiez également Java et XML en réponse unique.
Android
Écrire une explication avec du code est toujours une bonne pratique. Merci!
surajs1n
-1
package net.itempire.virtualapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class BaseActivity extends AppCompatActivity {
EditText editText;
TextView textView;
TextView textView2;
TextView textView3;
TextView textView4;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        editText=(EditText)findViewById(R.id.edt);
        textView=(TextView) findViewById(R.id.tv1);
        textView2=(TextView) findViewById(R.id.tv2);
        textView3=(TextView) findViewById(R.id.tv3);
        textView4=(TextView) findViewById(R.id.tv4);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             textView2.setText(Base64.encodeToString(editText.getText().toString().getBytes(),Base64.DEFAULT));
            }
        });

        textView3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView4.setText(new String(Base64.decode(textView2.getText().toString(),Base64.DEFAULT)));

            }
        });


    }
}
Asif Ali
la source
-2

pour l'API Android byte[]à l' Base64Stringencodeur

byte[] data=new byte[];
String Base64encodeString=android.util.Base64.encodeToString(data, android.util.Base64.DEFAULT);
orhan
la source