Basis 64 mengkodekan dan mendekode kode contoh

214

Apakah ada yang tahu cara mendekode dan menyandikan string di Base64 menggunakan Base64. Saya menggunakan kode berikut, tetapi tidak berfungsi.

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)));
maks
sumber
1
Anda harus mengimpor ini import android.util.Base64;dan kemudian dapat menggunakan Base64.encodeToString& Base64.decodesesuai dengan kebutuhan Anda
Zohab Ali

Jawaban:

490

Pertama:

  • Pilih penyandian. UTF-8 umumnya merupakan pilihan yang baik; tetap berpegang pada penyandian yang pasti akan berlaku di kedua sisi. Akan jarang menggunakan sesuatu selain UTF-8 atau UTF-16.

Ujung transmisi:

  • Enkode string ke byte (misalnya text.getBytes(encodingName))
  • Encode byte ke base64 menggunakan Base64kelas
  • Kirimkan base64

Pihak penerima:

  • Terima base64
  • Dekode base64 ke byte menggunakan Base64kelas
  • Decode byte ke string (misalnya new String(bytes, encodingName))

Jadi sesuatu seperti:

// 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");

Atau dengan 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
sumber
dapatkah Anda memberi saya kode pasti yang akan sangat membantu. saya menggunakan tetapi tidak berfungsi. Sumber string = "kata sandi"; byte [] byteArray = source.getBytes ("UTF-16"); Base64 bs = Base64 baru (); //bs.encodeBytes(byteArray); System.out.println (bs.encodeBytes (byteArray)); //bs.decode(bs.encodeBytes(byteArray)); System.out.println (bs.decode (bs.encodeBytes (byteArray)));
Maks
9
@ Max: "Ini tidak berfungsi" tidak pernah deskripsi yang baik tentang apa yang terjadi. Akan mengedit posting saya.
Jon Skeet
3
Juga perhatikan bahwa Anda tidak boleh memanggil metode statis seolah-olah mereka metode contoh ...
Jon Skeet
3
jika Anda mengatakannya seperti itu, String Base64 = Base64.encodeToString akan berfungsi (data, Base64.NO_WRAP);
Joy
1
@portfoliobuilder: Sama sekali tidak. UTF-8dijamin penyandian yang valid di Java: lihat docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html . Harus diakui hari ini saya akan menentukanStandardCharsets.UTF_8 . Saya telah memperbarui jawaban untuk menentukan bahwa Anda harus percaya diri di hadapan charset, tapi aku cukup banyak selalu menggunakan UTF-8.
Jon Skeet
18

Bagi siapa pun yang berakhir di sini saat mencari info tentang cara mendekodekan string yang disandikan Base64.encodeBytes(), inilah solusi saya:

// 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"); 

Juga, saya mendukung versi Android yang lebih lama jadi saya menggunakan pustaka Base64 Robert Harder dari http://iharder.net/base64

Dunfield
sumber
10

Untuk Kotlin mb lebih baik menggunakan ini:

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)
}

Contoh:

Log.d("LOGIN", "TEST")
Log.d("LOGIN", "TEST".encode())
Log.d("LOGIN", "TEST".encode().decode())
brunql
sumber
1
Penamaan untuk fungsi ekstensi ini mengerikan. Saya akan sangat merekomendasikan menggunakan encodeToBase64 atau yang serupa.
Rolf ツ
Mereka sama sekali tidak jelas dan jelas. Katakan padaku: apa artinya "decode" atau "encode"? Ada ribuan algoritma decoding / encoding ... Bagaimana jika Anda membutuhkan Base64 dan Hex? Bagaimana Anda memberi nama metode itu?
Rolf ツ
Belum lagi standar Base64 yang berbeda di luar sana.
Rolf ツ
Jelas dan jelas untuk kasus penggunaan ini. Jika saya membutuhkan algoritma lain saya tidak akan pernah menggunakannya sebagai metode ekstensi.
brunql
1
Namun demikian saya lebih suka sesuatu seperti: 'toBase64 ()' dan 'fromBase64 ()' sebagai minimum. Dengan cara ini saya tidak perlu membaca dokumentasi apa pun untuk mengetahui metode apa yang akan dilakukan. Ingat: "kode dibaca lebih dari yang tertulis".
Rolf ツ
8

Jika Anda menggunakan Kotlin daripada menggunakan seperti ini

Untuk Encode

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

Untuk Decode

val datasd = Base64.decode(base64, Base64.DEFAULT)
val text = String(datasd, charset("UTF-8"))
Mohit Suthar
sumber
3
Atau Anda dapat menggunakan Charsets.UTF_8 alih-alih charset ("UTF-8").
makovkastar
@makovkastar baru saja mengonfirmasi, sekarang StandardCharsets.UTF_8
Matt
7

sesuatu seperti

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
sumber
5
Jawaban Anda menyiratkan bahwa penyandian kata sandi di base64 adalah praktik yang baik. Faktanya BUKAN karena siapa saja bisa memecahkannya.
Heinrich
2

Untuk mengenkripsi:

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

Untuk mendekripsi:

byte[] decrypt= Base64.decode(base64, Base64.DEFAULT);
String text = new String(decrypt, "UTF-8");
Komunitas
sumber
1

Berdasarkan jawaban sebelumnya saya menggunakan metode utilitas berikut jika ada orang yang ingin menggunakannya.

    /**
 * @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 Menjadi
sumber
0

Kelas 'java.util.Base64' menyediakan fungsionalitas untuk menyandikan dan mendekode informasi dalam format Base64.

Bagaimana cara mendapatkan Base64 Encoder?

Encoder encoder = Base64.getEncoder();

Bagaimana cara mendapatkan Base64 Decoder?

Decoder decoder = Base64.getDecoder();

Bagaimana cara menyandikan data?

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

Bagaimana cara mendekode data?

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

Anda bisa mendapatkan detail lebih lanjut di tautan ini .

Hari Krishna
sumber
-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
sumber
ini untuk menyandikan dan menyalin kode melalui base64 di studio android
Asif Ali
Harap perbarui komentar Anda sebagai jawaban. Juga memposting Java dan XML dalam satu jawaban.
Android
Menulis beberapa penjelasan bersama dengan beberapa kode selalu merupakan praktik yang baik. Terima kasih!
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
sumber
-2

untuk API Android byte[]ke Base64Stringencoder

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