261

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))); 
1
  • 4
    You must import this import android.util.Base64; and then can use Base64.encodeToString & Base64.decode according to your needs Commented Dec 8, 2018 at 10:10

13 Answers 13

563

First:

  • 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); 
Sign up to request clarification or add additional context in comments.

9 Comments

@max: "It's not working" is never a good description of what's happening. Will edit my post though.
Also note that you shouldn't call static methods as if they're instance methods...
if you put it like that it will work String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
@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.
When I use Base64.DEFAULT then it says bad base64. So use Base64.URL_SAFE and enjoyee
|
32

For Kotlin mb better to use this:

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

8 Comments

Naming for these extensions functions is horrible. I would highly recommend using encodeToBase64 or something similar.
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?
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".
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.
So much fuss for an example :)
|
21

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

Comments

12

If you are using Kotlin than use like this

For Encode

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

2 Comments

Or you can use Charsets.UTF_8 instead of charset("UTF-8").
@makovkastar just confirm, now StandardCharsets.UTF_8
7

something like

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

1 Comment

Your answer implies that encoding passwords in base64 is a good practice. In fact it is NOT as anyone can simply decode it.
6

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

Comments

2

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"; } } 

Comments

1

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

Comments

1

For API level 26+

String encodedString = Base64.getEncoder().encodeToString(byteArray); 

Ref: https://developer.android.com/reference/java/util/Base64.Encoder.html#encodeToString(byte[])

Comments

1

Answer from 2021 in Kotlin.

Encode :

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

1 Comment

Thank you! Just accessing Base64.getEncoder is not available on if your API minimum is set to < 26!
0
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))); } }); } } 

Comments

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

3 Comments

this is for to encode and dcode through base64 in android studio
Please update your comment in answer. Also post Java and XML in single answer.
Writing some explanation along with some code is always a good practice. Thanks!
-1

for android API byte[] to Base64String encoder

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

1 Comment

note, this is outdated, I think since Android API 26. use Base64.getEncoder().encodeToString(data) instead

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.