【问题标题】:IllegalArgumentException Base64 to image decoding androidIllegalArgumentException Base64 到图像解码android
【发布时间】:2012-08-09 12:23:16
【问题描述】:

我想将 base64 格式的 web 服务中的图像解码为位图,并在我的 android 应用程序中使用它。 这是我的方法:

public Bitmap getCaptcha() throws IOException
    { 

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        String json = jsonParser.getCaptcha(captchaURL, params);
        Log.i("", json);

         byte [] encodeByte=Base64.decode(json.getBytes(),Base64.DEFAULT);
         Bitmap bitmap=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
         return bitmap;

    }

如果我使用我的 php 脚本解码从 getCaptcha 方法获得的字符串 - 它会正确显示。但是当我在我的应用程序中执行此操作时,我得到一个

 FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.assignmentexpert/com.assignmentexpert.RegisterActivity}: java.lang.IllegalArgumentException: bad base-64
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
   at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)
   Caused by: java.lang.IllegalArgumentException: bad base-64
    at android.util.Base64.decode(Base64.java:161)
    at android.util.Base64.decode(Base64.java:136)
    at com.library.UserFunctions.getCaptcha(UserFunctions.java:97)
    at com.assignmentexpert.RegisterActivity.onCreate(RegisterActivity.java:66)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    ... 11 more

这是什么原因?

我添加了我得到的 base64 代码:

/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gMTUK/9sAQwA1JSgvKCE1LysvPDk1P1CFV1BJSVCjdXthhcGqy8i+qrq31fD//9Xi/+a3uv///////////87//////////////9sAQwE5PDxQRlCdV1ed/9y63P///////////////////////////////////////////////////////////////////8AAEQgAKAB4AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A0mOBkUtI/T8R/OgjPcj6UADOF6nn0qjd3jqdkfynuamnfYRFCMyt39BVS8RYI0jHLH5mPrTSAmtJJHjJZyTnvVpSyjoGHqKhsRtts5wSan4bkA59qTDQY9yquqbW3N0BGKJJjEhd1+UehqnJl5VmJJHmBB9K0Nif3R+VFgsQC/hPcj6inrdRv93mla3ibqo/CqF7bpBtZCRntTCxo7nPRMfU1FPL5SFmfJ7KKisCZIzvyQOmaNQ4aEdF3f4UrBYWO6lVlFwm0N0PpVyorlQ9tID/AHSaLZ99ujHk45oAlooooAR/u/TmmTyiGMseT0A9TT3+430qO4hWZAG6A54oAii2wjdKw81+SSRxVG8ZXnJUgjHUHNX1sogP9WCfUk1UvoREylVABHamhlm0liESqWXdT7yXy4vlPztwKgtYYWiV2Q7s9RU1xA85R0YKV6ZFLqIhnTyraFSOjjn86vKyuMqQR7VnzwzfuxNLu3OBgVacx28XyjhewPNDAZJFchmaKbIJztPaqbcSf6VvzWjHOkg+Vwahvnj8kqcbu1NMCa3eJo8RYwO1Nu4PPjwDhgciqenBvNJGcYrQkkESF26Ck9GBTZ7oxGJo+oxv9qnsf+PRPx/nTJ72PyWCHLEYAqa2Qx26KeuOaYEtFFFIAIyCD0NJjLD0FFFAC0yVUcAOob0BoooAI4ljGFAFOKgnPf2oooAY0KuylsnacjJp5UEYIGKKKAIHs4X527T7UwafEDyWNFFFwLMcaRLtQYFKyhhhgCPQ0UUAMFvEGyI1z9KkwKKKACiiigD/2Q==n

问题是当我从浏览器复制代码并将其硬编码到我的程序时 - 一切正常。但是当我通过我的 android 程序获取 base64 数据并尝试对 base64 进行硬编码时 - 我得到了一个异常。浏览器中的代码与我通过 Android 获得的代码看起来相同。但是,实际上,并不是因为结果不同)

【问题讨论】:

    标签: android bitmap base64 decode illegalargumentexception


    【解决方案1】:

    实际上有一个简单的解决方案,它会在一个有效的 base64 字符串之后删除所有坏数据:

    String[] safe = received.split("=");
    //put all chars before first base64 '=' padding char into safe[0]
    
    try {
         byte[] recvpicbyte = Base64.decode(safe[0], Base64.NO_PADDING);
         //decode safe [0], note not in 'DEFUALT', use 'NO_PADDING' so it wont expect the '='
    
         //...do whatever with output
    

    【讨论】:

      【解决方案2】:

      您的 Base64 代码的填充看起来不太好(代码末尾的尾随 = 符号数错误)。比如Hello对应的base64代码是SGVsbG8=,最后一个=就是为了让base64数据块的大小符合Base64 RFC。所以SGVsbG8==SGVsbG8 都是不正确的,因为块的长度 不符合 base64 规范,即使它们都表示 Hello,如果我们坚持相关字符(“Base 64 Alphabet”)。

      一些实现对此非常宽容。他们只是假设长度不正确的 base64 块需要用一两个“=”填充。其他一些(包括 Android)是不允许的,因此您在 PHP 和 Android 程序的行为之间面临的这种差异。

      这只是一个假设,因为我看不到您尝试解码的 base64 数据。要检查这一点,您可以使用this online base64 decoder,它会告诉您填充是否正常。

      无论如何,使用 base64 代码示例会更容易。你会把它添加到你的帖子中吗?我会相应地更新我的答案。

      【讨论】:

      • 代码末尾的= 后面有一个n。这使得 base64 数据块无效。一旦删除,其余的都是有效的,我可以毫无问题地对其进行解码。也许问题来自您的服务。似乎在服务代码中错误地输入了 \n 行终止字符 n
      • EEEEEEEEEEEEEE !!!!!!非常感谢!!!!!!你怎么知道这个???我想知道 - 这是什么原因? Web 服务正确发送数据 - 因为它在浏览器中正确显示......为什么这个“n”在我的客户端出现?我发送请求,应该会收到相同的数据...但这不是...很奇怪...非常感谢...
      • 不客气 :) 也许错误出在您的 Android 客户端中,它试图将\n 添加到它读取的数据中。无论如何,我只是猜测,但请告诉我:)
      • 问题不在\n中,而在n中...客户端将n添加为最后一个符号...从Web服务的字符串数据中排除它解决了问题。谢谢。
      • 不错!那么我想我们可以结束这个问题了。
      【解决方案3】:

      问题在于在图像的 base64 字符串末尾添加一个“n”字符到 JSON 响应。它出现的原因是神秘的。有趣的是,来自该 Web 服务的其他 JSON 响应没有“n”字符。我尝试使用常规 Java 代码获取 base64 图像字符串 - 一切都很好 - 没有“n”字符。所以它出现由于android客户端 - 端。尝试调查其出现的原因和防止方法。 感谢Shlublu 的大力帮助!!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 2013-10-25
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多