Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Input byte array has incorrect ending byte at 40

I have a string that is base64 encoded. It looks like this:

eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=

Any online tool can decode this to the proper string which is {"bla1":"bla1","bla2":"bla2"}. However, my Java implementation fails:

import java.util.Base64;
System.out.println("payload = " + payload);
String json = new String(Base64.getDecoder().decode(payload));

I'm getting the following error:

payload = eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=
java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 40

What is wrong with my code?

like image 977
toom Avatar asked Feb 09 '16 13:02

toom


3 Answers

Okay, I found out. The original String is encoded on an Android device using android.util.Base64 by Base64.encodeToString(json.getBytes("UTF-8"), Base64.DEFAULT);. It uses android.util.Base64.DEFAULT encoding scheme.

Then on the server side when using java.util.Base64 this has to be decoded with Base64.getMimeDecoder().decode(payload) not with Base64.getDecoder().decode(payload)

like image 154
toom Avatar answered Nov 15 '22 21:11

toom


I was trying to use the strings from the args. I found that if I use arg[0].trim() that it made it work. eg

Base64.getDecoder().decode(arg[0].trim());

I guess there's some sort of whitespace that gets it messed up.

like image 40
JustGage Avatar answered Nov 15 '22 22:11

JustGage


Maybe too late, but I also had this problem.

By default, the Android Base64 util adds a newline character to the end of the encoded string.
The Base64.NO_WRAP flag tells the util to create the encoded string without the newline character.

Your android app should encode src something like this:

String encode = Base64.encodeToString(src.getBytes(), Base64.NO_WRAP);
like image 2
Artem Komarov Avatar answered Nov 15 '22 22:11

Artem Komarov