【问题标题】:java decoding base64 Stringjava解码base64字符串
【发布时间】:2013-07-24 14:47:31
【问题描述】:

我意识到这可能更像是一个一般性的 java 问题,但由于它在 Notes\Domino 环境中运行,我想我会先检查该社区。​​p>

总结:

我似乎无法解码字符串:dABlAHMAdAA= using lotus.domino.axis.encoding.Base64 或 sun.misc.BASE64Decoder

我知道原文是:test

我通过在http://www5.rptea.com/base64/ 解码确认它似乎是 UTF-16。

作为简单的测试,使用以下任一方法:

String s_base64 = "dABlAHMAdAA=";
byte[] byte_base64 = null;
String s_decoded = "";

byte_base64 = new sun.misc.BASE64Decoder().decodeBuffer(s_base64);
s_decoded = new String(byte_base64, "UTF-16");
System.out.println("Test1: " + s_decoded);

byte_base64 = lotus.domino.axis.encoding.Base64.decode(s_base64);
s_decoded = new String(byte_base64, "UTF-16");
System.out.println("Test2: " + s_decoded);

System.out.println("========= FINISH.");

我得到了输出:
测试1:????
测试2:????

如果我将字符串创建为 UTF-8

s_decoded = new String(byte_base64, "UTF-8");

它输出:
t
没有抛出错误,但它没有完成代码,没有到达“FINISH”。

详情

我正在访问一个 asmx Web 服务,在 SOAP 响应中,一些节点包含 base64 编码数据。在这个时间点上,没有办法改变服务,所以我不得不自己进行 XPath 和解码。编码数据是文本或 html。如果我通过http://www5.rptea.com/base64/ 传递编码数据并选择UTF-16,它会正确解码,所以我一定做错了。

作为旁注,我编码了“测试”:

s_base64 = lotus.domino.axis.encoding.Base64.encode(s_text.getBytes());
System.out.println("test1 encodes to: " + s_base64);

s_base64 = new sun.misc.BASE64Encoder().encode(s_text.getBytes());
System.out.println("test2 encodes to: " + s_base64);

它们都编码为:
dGVzdA== ...如果您随后按预期将其输入到上面的 2 个解码器中,则可以正确解码。

如果我访问上面的站点,并将“test”编码为 UTF-16,我会得到:dABlAHMAdAA= 以便确认数据采用 UTF-16。

就好像数据是真正的 base64 数据,但解码器无法识别它。我现在有点难过。

任何指针或 cmets 将不胜感激。

【问题讨论】:

    标签: java xpages lotus-domino utf-16


    【解决方案1】:

    字符串已以 UTF-16LE(小端序)编码,其中首先存储最低有效字节。 Java 默认为大端。你需要使用:

    s_decoded = new String(byte_base64, "UTF-16LE");
    

    【讨论】:

    • 如果我能跳过屏幕给你一个拥抱,我会的。我已经为此挣扎了好几个小时。非常非常感谢。
    • new String(byte_base64 , StandardCharsets.UTF_16LE) 在 Java 7 之后是可能的
    【解决方案2】:

    我在我的 base64 解码在线工具上使用了您的示例“dABlAHMAdAA=”,您似乎缺少 Apache base64 jar 文件 点击下面的链接。

    http://www.hosting4free.info/Base64Decode/Base64-Decode.jsp

    网站背后的代码是

    import org.apache.commons.codec.binary.Base64;
    
    public class base64decode
    
    {
    
    public static void main(String[] args) throws UnsupportedEncodingException 
       {
    
    
        byte[] decoded = Base64.decodeBase64("YWJjZGVmZw==".getBytes());
        System.out.println(new String(decoded) + "\n");
    
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多