为什么这不能解码base64字符串?

时间:2015-05-29 23:24:15

标签: java encoding base

我创建了一些应该有效的代码:

String input = "PONT4uYmTYwiP0omcAxZG8a3vKI=";
String expectedOut = "3ce353e2e6264d8c223f4a26700c591bc6b7bca2";

Base64.Decoder decoder = Base64.getDecoder();
byte[] outAsByte = decoder.decode(input);
String output = new String(outAsByte, StandardCharsets.UTF_8);

System.out.println(input);
System.out.println(output);

(基于How do I decode a base64 encoded string? - 我知道它在C#中)

令人惊讶的是,这输出了以下内容:

PONT4uYmTYwiP0omcAxZG8a3vKI=
<?S??&M?"?J&pY???

为什么这会打印出一堆乱码而不是预期的输出?

编辑:我使用此bash命令获得了预期的输出:

echo -n PONT4uYmTYwiP0omcAxZG8a3vKI= | base64 -d | xxd -p

3 个答案:

答案 0 :(得分:2)

来自xxd的手册页

  

xxd创建给定文件或标准输入的十六进制转储。

您正在为解码值采用十六进制转储。

您可以使用提供的实用程序here

重现它
System.out.println(Hex.encodeHexString(outAsByte));

产生

3ce353e2e6264d8c223f4a26700c591bc6b7bca2

与您的

匹配
                  //  3ce353e2e6264d8c223f4a26700c591bc6b7bca2
String expectedOut = "3ce353e2e6264d8c223f4a26700c591bc6b7bca2";

答案 1 :(得分:1)

你是如何得出预期结果的?

使用base64和UTF-8解码您的输入会产生<ãSâæ&M"?J&pYÆ·¼¢,这是您的实际结果,除了UTF-8特定字符。

答案 2 :(得分:0)

0x3c == '<'等。

预期输出应该是0x3c 0xe3 ...