java解码base64字符串

nic*_*all 4 java utf-16 lotus-domino xpages

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

摘要:

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

我知道原文是:测试

我在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.");
Run Code Online (Sandbox Code Playgroud)

我得到输出:
Test1:????
测试2:????

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

s_decoded = new String(byte_base64, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

它输出:
t
没有抛出错误,但它没有完成代码,没有达到"完成".

详情

我正在访问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);
Run Code Online (Sandbox Code Playgroud)

它们都编码为:
dGVzdA == ...如果您按照预期的那样输入上面的2个解码器,则正确解码.

如果我去上面的站点,并将"test"编码为UTF-16,我得到:dABlAHMAdAA =这样确认数据是UTF-16.

这就像数据是真正的base64数据,但解码器不能识别它.我此刻有点难过.

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

Jon*_*oni 11

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

s_decoded = new String(byte_base64, "UTF-16LE");
Run Code Online (Sandbox Code Playgroud)