输入字节数组在40处有不正确的结束字节

时间:2016-02-09 13:04:28

标签: java base64 illegalargumentexception

我有一个base64编码的字符串。它看起来像这样:

eyJibGExIjoiYmxhMSIsImJsYTIiOiJibGEyIn0=

任何在线工具都可以将其解码为{"bla1":"bla1","bla2":"bla2"}的正确字符串。但是,我的Java实现失败了:

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

我收到以下错误:

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

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:20)

好的,我发现了。原始字符串使用android.util.Base64 Base64.encodeToString(json.getBytes("UTF-8"), Base64.DEFAULT);在Android设备上进行编码。它使用android.util.Base64.DEFAULT编码方案。

然后在使用java.util.Base64时在服务器端,必须使用Base64.getMimeDecoder().decode(payload) 而不是解析Base64.getDecoder().decode(payload)

答案 1 :(得分:1)

也许为时已晚,但我也遇到了这个问题。

默认情况下,Android Base64 util在编码字符串的末尾添加换行符。
Base64.NO_WRAP标志告诉util创建不含换行符的编码字符串。

您的android应用应该对src进行如下编码:

String encode = Base64.encodeToString(src.getBytes(), Base64.NO_WRAP);

答案 2 :(得分:0)

我试图使用args中的字符串。我发现,如果我使用arg[0].trim()它就可以了。例如

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

我猜有某种空白让它搞砸了。