【问题标题】:Base64 String decoding issue in Java 7Java 7 中的 Base64 字符串解码问题
【发布时间】:2014-10-07 20:48:45
【问题描述】:

我得到了一个 Base64 编码的字符串,我想在我的引擎中的 Java 7 上对其进行解码。 字符串是这样的:

String msg = "TwBuACAAMAAzACAATQBhAHIAIAAxADQALAAgAGEAdAAgADEAOQAyADkAaAByAHMALAAg
    AFMAeQByAGkAYQBuACAAagBlAHQAcwAgAGYAaQByAGUAZAAgADEAOAAgAHIAbwBjAGsAZQB0AHMAIA
    BhAHQAIABBAHIAcwBhAGwAJwBzACAAVwBhAGQAaQAgAEsAaABhAGkAcgAgAGEAbgBkACAAdABoAGUA
    IAByAG8AYQBkACAAYgBlAHQAdwBlAGUAbgAgAFMAbABlAGUAdABhACAAYQBuAGQAIABuAG8AcgB0AG
    gAZQByAG4AIAB0AG8AdwBuACAAbwBmACAAQQByAHMAYQBsAC0AQgBhAGEAbABiAGUAawAgAGEAcgBl
    AGEALgA=";

它来自一个用 C# 编写的 Web 服务。

如果我将它粘贴到网络上的任何 Base64 解码器 中,它可以正常工作。如果我使用 apache commons decoder,它会给我一个奇怪的输出,其中每个字母后跟一个带问号的黑色菱形(参见 sreenshot):

我尝试在解码之前和转换为字符串时设置编码,但没有成功。 代码如下:

System.setProperty("file.encoding", "UTF-8");       
String enc =
System.getProperty("file.encoding","UTF-8");
System.out.println(enc);        
String msg = "TwBuACAAMAAzACAATQBhAHIAIAAxADQALAAgAGEAdAAgADEAOQAyADkAaAByAHMALAAg
    AFMAeQByAGkAYQBuACAAagBlAHQAcwAgAGYAaQByAGUAZAAgADEAOAAgAHIAbwBjAGsAZQB0AHMAIA
    BhAHQAIABBAHIAcwBhAGwAJwBzACAAVwBhAGQAaQAgAEsAaABhAGkAcgAgAGEAbgBkACAAdABoAGUA
    IAByAG8AYQBkACAAYgBlAHQAdwBlAGUAbgAgAFMAbABlAGUAdABhACAAYQBuAGQAIABuAG8AcgB0A
    GgAZQByAG4AIAB0AG8AdwBuACAAbwBmACAAQQByAHMAYQBsAC0AQgBhAGEAbABiAGUAawAgAGEAcgB
    lAGEALgA=";

byte[] res = Base64.decodeBase64(msg);      
System.out.println(new String(res, "UTF-8"));

有什么想法吗?

亲切的问候, 卡托佩特

【问题讨论】:

  • 第一个问题:底层数据是用什么字符编码的?如果它是(例如)UTF-16,那么结果不会太令人惊讶,具体取决于您如何查看它......
  • 如果我将你的 base64 字符串放入 this online base64 decoder 我也会在字符之间得到黑色菱形

标签: java c# base64 decode apache-commons


【解决方案1】:

字符串采用 UTF-16LE 编码,根据 Oracle 的 documentation十六位 Unicode(或 UCS)转换格式,小端字节序。有关 UTF-16 变体的更多信息,请访问here

将 base64 字符串转换为字节后,请执行以下操作:

byte[] bytes; // base64 decoded bytes
String s = new String(bytes, "UTF-16LE");

字符串的值为:

3 月 14 日 1929 时,叙利亚战机向阿尔萨尔河谷发射了 18 枚火箭弹 Khair 和 Sleeta 和北部城镇 Arsal-Baalbek 之间的道路 地区。

【讨论】:

  • 酷,我尝试了各种组合,但没有成功。这个确实成功了!谢谢罗比。英雄
【解决方案2】:

我在 Eclipse 中的输出,

String msg = "TwBuACAAMAAzACAATQBhAHIAIAAxADQALAAgAGEAdAAgADEAOQAyADkAaAByAHMALAAgAFMAeQByAGkAYQBuACAAagBlAHQAcwAgAGYAaQByAGUAZAAgADEAOAAgAHIAbwBjAGsAZQB0AHMAIABhAHQAIABBAHIAcwBhAGwAJwBzACAAVwBhAGQAaQAgAEsAaABhAGkAcgAgAGEAbgBkACAAdABoAGUAIAByAG8AYQBkACAAYgBlAHQAdwBlAGUAbgAgAFMAbABlAGUAdABhACAAYQBuAGQAIABuAG8AcgB0AGgAZQByAG4AIAB0AG8AdwBuACAAbwBmACAAQQByAHMAYQBsAC0AQgBhAGEAbABiAGUAawAgAGEAcgBlAGEALgA=";
byte[] b = Base64.decodeBase64(msg);
System.out.println(new String(b));

输出

3 月 14 日 1929 时,叙利亚战机向 Arsal 的 Wadi Khair 以及 Sleeta 和北部城镇 Arsal-Baalbek 地区之间的道路发射了 18 枚火箭弹。

【讨论】:

  • 因为您使用的是 Windows,并且您的平台的默认编码可能设置为 little-endian UTF-16。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2011-09-22
  • 1970-01-01
  • 2012-12-05
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多