Java解码Base64字符串

4

我知道这可能更多是一个关于Java的一般性问题,但由于它在Notes\Domino环境中运行,所以我首先想请教这个社区。

概述:

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

我知道原始文本是: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,则可以正确解码,因此我必须做错了什么。

作为附注,我编码了“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个回答

11

该字符串已被编码为UTF-16LE(小端序),其中最不重要的字节先存储。Java默认使用大端序。您需要使用:

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

如果我能穿过屏幕给你一个拥抱,我一定会的。我已经在这个问题上挣扎了好几个小时了。非常感谢。 - nick wall
1
在Java 7之后,可以使用new String(byte_base64 , StandardCharsets.UTF_16LE)。 - naveejr

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");

}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接