java解码base64字符串

时间:2013-07-24 14:47:31

标签: java xpages lotus-domino utf-16

我意识到这可能更像是一般的java问题,但是因为它在Notes \ Domino环境中运行,所以我想先检查一下这个社区。

摘要:

我似乎无法解码字符串:dABlAHMAdAA =使用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:????

如果我将String创建为UTF-8

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

输出:
Ť
没有抛出任何错误,但它没有完成代码,也没有达到“完成”。

详细

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

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

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数据,但解码器不能识别它。我此刻有点难过。

我们将非常感激地收到任何指示或评论。

2 个答案:

答案 0 :(得分:11)

该字符串已编码为UTF-16LE(little-endian),其中首先存储最低有效字节。 Java默认为big-endian。你需要使用:

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

答案 1 :(得分:0)

我在我的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");

}

}