【问题标题】:Base64 Encoding: Illegal base64 character 3cBase64 编码:非法 base64 字符 3c
【发布时间】:2018-02-24 16:48:52
【问题描述】:

我正在尝试将 xml 格式的数据解码为字节 base64,但我遇到了问题。我的方法是在 java 中,它采用 String 数据并将其转换为 bytes,如下所示。

String data = "......"; //string of data in xml format
byte[] dataBytes = Base64.getDecoder().decode(data);

失败并给出如下异常。

java.lang.IllegalArgumentException: Illegal base64 character 3c
    at java.util.Base64$Decoder.decode0(Base64.java:714)
    at java.util.Base64$Decoder.decode(Base64.java:526)
    at java.util.Base64$Decoder.decode(Base64.java:549)
    at XmlReader.main(XmlReader.java:61)

xml格式与base64不兼容吗?

【问题讨论】:

  • 好吧,data 是什么?
  • 它看起来像这样:1.0
  • 那是不是 base64 编码的字符串。
  • 如何改成base64字符串?我需要使用编码吗?
  • 是的,当然。你有一些人类可读的数据,就像你迄今为止展示的那样,然后你 encode 它到 base64,它只会有允许的 base64 字符,然后你 decode 那个 base64 字符串再次变成原始内容。

标签: java encoding utf-8 base64 decoding


【解决方案1】:

感谢@luk2302,我能够解决这个问题。在解码字符串之前,我需要先将其编码为 Base64

    byte[] dataBytes = Base64.getEncoder().encode(data.getBytes());
    dataBytes = Base64.getDecoder().decode(dataBytes);

【讨论】:

  • 您只是对文本进行编码并立即对其进行解码吗?如果是这样,我不明白通过这个实现了什么。
  • 可能编码函数正在纠正编码不匹配,这在第一次实例中没有使转换工作
  • @funder7 这样你就得到了 original (encoded) 字符串,而不是真正的解码值 - 编码(由其他人) -> 编码(由你) - > 解码(由您)= 编码(由其他人);即原来的
【解决方案2】:

您应该首先从字符串中获取字节(在某些字符编码中)。

对于这些字节,您使用编码器为这些字节创建 Base64 表示。

然后可以将此 Base64 字符串解码回字节,并使用相同的编码将这些字节转换为字符串。

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Base64Example {

  public static void main(String[] args) {
    final String xml = "<root-node><sub-node/></root-node>";
    final byte[] xmlBytes = xml.getBytes(StandardCharsets.UTF_8);
    final String xmlBase64 = Base64.getEncoder().encodeToString(xmlBytes);
    System.out.println(xml);
    System.out.println(xmlBase64);

    final byte[] xmlBytesDecoded = Base64.getDecoder().decode(xmlBase64);
    final String xmlDecoded = new String(xmlBytesDecoded, StandardCharsets.UTF_8);
    System.out.println(xmlDecoded);
  }

}

输出是:

<root-node><sub-node/></root-node>
PHJvb3Qtbm9kZT48c3ViLW5vZGUvPjwvcm9vdC1ub2RlPg==
<root-node><sub-node/></root-node>

【讨论】:

    【解决方案3】:

    就用这个方法

    getMimeDecoder()

    String data = "......";
    byte[] dataBytes =  Base64.getMimeDecoder().decode(data);
    

    【讨论】:

    • 这确实有效,虽然我很好奇这两个 API 之间有什么区别,但文档并不是很有帮助。
    • @azizbekian Mime 解码器在尝试解码 Base64 字符串时允许非法字符。
    【解决方案4】:

    我遇到了同样的错误,问题是字符串以data:image/png;base64, ...开头

    解决办法是:

    byte[] imgBytes = Base64.getMimeDecoder().decode(imgBase64.split(",")[1]);
    

    【讨论】:

    • 这就是我所做的resp = resp.replace("data:image/jpeg;base64,", "");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2015-01-31
    • 2023-03-18
    相关资源
    最近更新 更多