在Java中解码Base64字符串

73

我试图解码一个简单的Base64字符串,但无法成功。我目前正在使用org.apache.commons.codec.binary.Base64包。

我正在使用的测试字符串是:abcdefg,使用PHP编码为YWJjZGVmZw==

这是我目前正在使用的代码:

Base64 decoder = new Base64();
byte[] decodedBytes = decoder.decode("YWJjZGVmZw==");
System.out.println(new String(decodedBytes) + "\n") ;   

以上代码不会抛出错误,但是输出的解码字符串并非预期。


@TomasB 你发布的代码对我来说运行良好,那是完整的示例吗? - Affe
你粘贴的代码在我这里运行良好。您确定该代码片段是否实际执行了吗?您是否添加了一些固定字符串println或类似内容? - MvG
你的代码运行良好,输出“abcdefg”。 - vbezhenar
2
@Affe - 我不知道你所说的“只在系统默认编码中工作”的意思。无论使用哪个库,当你把字节转换为字符时,你都应该_始终_指定一个字符集。 - jtahlborn
2
如果没有打印任何内容,则问题在于您的程序中其他地方,而不是 Base-64 解码。 - erickson
显示剩余5条评论
4个回答

79

修改你正在使用的程序包:

import org.apache.commons.codec.binary.Base64;

然后像这样使用它:

byte[] decoded = Base64.decodeBase64("YWJjZGVmZw==");
System.out.println(new String(decoded, "UTF-8") + "\n");

小心使用sun.*包!https://dev59.com/DXRB5IYBdhLWcg3w6bYE - Diego Agulló
抱歉,我应该明确指出我必须使用org.apache.commons.codec.binary.Base64,因为它是一个安全的URL解码器。 - TomasB
3
在JDK中有javax.xml.bind.DatatypeConverter.parseBase64Binary方法,因此您无需使用sun API或外部库来处理base64。 - vbezhenar
@RTB 在从 byte[] 构造字符串时,应始终使用字符编码。例如更改为 new String(decoded, "UTF-8") - maasg
@TomasB 如果我的回答有帮助,请接受它,这样其他人也可以从中学习。如果没有,我还能怎么帮你? - RTB
在Android上,org.apache.commons.codec.binary.Base64被标记为已弃用。在这种情况下,请改用android.util.Base64。 - Ernest Poletaev

17
以下内容应该适用于最新版本的Apache common codec。
byte[] decodedBytes = Base64.getDecoder().decode("YWJjZGVmZw==");
System.out.println(new String(decodedBytes));

并且用于编码

byte[] encodedBytes = Base64.getEncoder().encode(decodedBytes);
System.out.println(new String(encodedBytes));

17

如果您不想使用Apache,可以使用Java8:

byte[] decodedBytes = Base64.getDecoder().decode("YWJjZGVmZw=="); 
System.out.println(new String(decodedBytes) + "\n");

3

base64通常用于图片。如果您想解码一张图片(在本例中为jpg,使用org.apache.commons.codec.binary.Base64包):

byte[] decoded = Base64.decodeBase64(imageJpgInBase64);
FileOutputStream fos = null;
fos = new FileOutputStream("C:\\output\\image.jpg");
fos.write(decoded);
fos.close();

3
Base64 是一种字节数组编码规范,与图像无关,这样的做法也不常见。 - Darrell Teague
3
图片的 Base 64 编码在旧版或不太复杂的消息传输协议中很常见。 - VivaLaPanda
1
在将图像嵌入XML文档或HTML数据URI中时,使用base64对其进行编码是很常见的。 - James Daily

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