添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am using the following code, but it's not working.

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)));
                You must import this import android.util.Base64; and then can use Base64.encodeToString & Base64.decode according to your needs
– Zohab Ali
                Dec 8, 2018 at 10:10
  • Choose an encoding. UTF-8 is generally a good choice; stick to an encoding which will definitely be valid on both sides. It would be rare to use something other than UTF-8 or UTF-16.
  • Transmitting end:

  • Encode the string to bytes (e.g. text.getBytes(encodingName))
  • Encode the bytes to base64 using the Base64 class
  • Transmit the base64
  • Receiving end:

  • Receive the base64
  • Decode the base64 to bytes using the Base64 class
  • Decode the bytes to a string (e.g. new String(bytes, encodingName))
  • So something like:

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

    Or with 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);
                    @max: "It's not working" is never a good description of what's happening. Will edit my post though.
    – Jon Skeet
                    Sep 9, 2011 at 12:23
                    if you put it like that it will work String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
    – Joy
                    Oct 8, 2013 at 14:20
                    @portfoliobuilder: Absolutely not. UTF-8 is guaranteed to be a valid encoding in Java: see docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html. Admittedly these days I'd specify StandardCharsets.UTF_8 instead. I've updated the answer to specify that you should be confident in the presence of the charset, but I'd pretty much always use UTF-8.
    – Jon Skeet
                    Jan 3, 2017 at 18:37
    
    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)
    

    Example:

    Log.d("LOGIN", "TEST")
    Log.d("LOGIN", "TEST".encode())
    Log.d("LOGIN", "TEST".encode().decode())
                    Naming for these extensions functions is horrible. I would highly recommend using encodeToBase64 or something similar.
    – Rolf ツ
                    Nov 14, 2018 at 10:59
                    They are absolutely not clear and obvious. Tell me: what means "decode" or "encode"? There are thousands of decoding/encoding algorithms... What if you need Base64 and Hex? How would you name the methods then?
    – Rolf ツ
                    Nov 15, 2018 at 11:25
                    Nevertheless I would prefer something like: 'toBase64()' and 'fromBase64()' as a minimum. This way I don't need to read any documentation to know what the method will do. Keep in mind: "code is read more than it is written".
    – Rolf ツ
                    Nov 15, 2018 at 11:30
                    Yes, if i want to emphasize encoding and algorithm i will name it like toBase64UTF8(), but i don't need it, simple is better. Naming is one of the major problem in development. Please vote down on this answer and we close this dicussion, thanks.
    – brunql
                    Nov 15, 2018 at 11:39
    

    To anyone else who ended up here while searching for info on how to decode a string encoded with Base64.encodeBytes(), here was my 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"); 
    

    Also, I'm supporting older versions of Android so I'm using Robert Harder's Base64 library from http://iharder.net/base64

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

    For Decode

    val datasd = Base64.decode(base64, Base64.DEFAULT)
    val text = String(datasd, charset("UTF-8"))
    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();
                    Your answer implies that encoding passwords in base64 is a good practice. In fact it is NOT as anyone can simply decode it.
    – Jan Heinrich Reimer
                    Jun 9, 2016 at 17:41
    

    To encrypt:

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

    To decrypt:

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

    Above many answers that don't work for me, and some of them are no exception handling in the correct way. here am adding a perfect solution that works amazing for me sure also for you too.

    //base64 decode string 
     String s = "ewoic2VydmVyIjoic2cuenhjLmx1IiwKInNuaSI6InRlc3RpbmciLAoidXNlcm5hbWUiOiJ0ZXN0
        ZXIiLAoicGFzc3dvcmQiOiJ0ZXN0ZXIiLAoicG9ydCI6IjQ0MyIKfQ==";
        String val = a(s) ;
         Toast.makeText(this, ""+val, Toast.LENGTH_SHORT).show();
           public static String a(String str) {
                 try {
                     return new String(Base64.decode(str, 0), "UTF-8");
                 } catch (UnsupportedEncodingException | IllegalArgumentException unused) {
                     return "This is not a base64 data";
    

    Based on the previous answers I'm using the following utility methods in case anyone would like to use it.

    * @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;

    'java.util.Base64' class provides functionality to encode and decode the information in Base64 format.

    How to get Base64 Encoder?

    Encoder encoder = Base64.getEncoder();
    

    How to get Base64 Decoder?

    Decoder decoder = Base64.getDecoder();
    

    How to encode the data?

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

    How to decode the data?

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

    You can get more details at this link.

    This might result in ClassNotFoundException on certain devices. Imo you should use android.util.Base64 instead (assuming we're in an android context, based on labels). – el_chupacabra Jul 16, 2021 at 15:32
    val data: String = "Hello"
    val dataByteArray: ByteArray = data.toByteArray()
    val dataInBase64: String = Base64Utils.encode(dataByteArray)
    

    Decode :

    val dataInBase64: String = "..."
    val dataByteArray: ByteArray = Base64Utils.decode(dataInBase64)
    val data: String = dataByteArray.toString()
                    Thank you! Just accessing Base64.getEncoder is not available on if your API minimum is set to < 26!
    – Alex Conner
                    May 27, 2021 at 21:25
    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)));
    
        <?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>
                    note, this is outdated, I think since Android API 26. use Base64.getEncoder().encodeToString(data) instead
    – rubo77
                    Dec 15, 2021 at 8:35
            

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.