【问题标题】:Input byte array has incorrect ending byte at 40输入字节数组在 40 处有不正确的结束字节
【发布时间】:2016-02-09 13:04:28
【问题描述】:

我有一个 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

我的代码有什么问题?

【问题讨论】:

  • Can't reproduce,字符串末尾的额外字符会引发确切的异常...
  • 但是你从哪里得到编码字符串?你如何将它传递给有效负载变量?因为正如你所说,它可以工作......我刚刚用 Java 8 测试过它,没有问题。

标签: java base64 illegalargumentexception


【解决方案1】:

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

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

【讨论】:

  • 你知道反过来是否有同样的问题吗?我的意思是,如果 Android 设备尝试读取由 Java 实现编码的字符串,我们会出错吗?
  • 我在从 Mac(Base64.getDecoder 工作的地方)迁移到 Windows 平台时遇到了这个问题。感谢您的解决方案!
【解决方案2】:

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

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

我猜有某种空格会弄乱它。

【讨论】:

    【解决方案3】:

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

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

    您的 android 应用程序应该像这样编码src

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

    【讨论】:

    • PHP 8 对我做了同样的事情;想象一下我的惊讶,旧版本的 PHP 没有像 IIRC 那样填充/包装
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2019-05-02
    • 2012-10-18
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多