0
byte[] commonsDecode = Base64.decodeBase64(data);
debug("The data is " + commonsDecode.length + " bytes long for the apache commons base64 decoder.");
BASE64Decoder decoder = new BASE64Decoder();
byte[] sunDecode = decoder.decodeBuffer(data);
Log.debug("The data is " + sunDecode.length + " bytes long for the SUN base64 decoder.");

请向我解释为什么这两个方法调用会为结果字节数组产生不同的长度。我最初认为这可能与字符编码有关,但如果是这样,我就无法正确理解所有问题。上面的代码在同一个系统和同一个应用程序中执行,顺序如上。因此,该系统上的默认字符编码将是相同的。

输入(测试)数据: 下面是Java字符串的System.out.println。

qFkIQgDq jk3ScHpqx8BPVS97YE4pP/nBl5Qw7mBnpSGqNqSdGIkLPVod0pBl Uz7NgpizHDicGzNCaauefAdwGklpPr0YdwCu4wRkwyAuvtDmL0BYASOn2tDw72LMz5FChtSa0CoCBQ2ARsFG2GdflnIWsUuBQapX73ZBMiqqm  ZCOnMRv9Ol8zT1TECddlKZMYAvmjANgq0sBPyUMF7co XY9BYAjV3L/cA8CGQpXGdrsAgjPKMhzk4hh1GAoQ1soX2Dva8p3erPJ4sy2Vcb6lS1Hap9FR0AZFawbJ10FFSTg10wxc24539kYA6xxq/TFqkhaEoSyTqjXjvo1SA==

Apache commons 解码器说它是 252 长度字节数组。Java Sun 解码器显示 256。

4

1 回答 1

2

解码的数据不是有效的 Base64 数据。

有效的 Base64 数据可以包含空格。通常,它每 72 个字符有一个换行符。但是,您的数据在随机位置包含空格。如果它们被删除(就像每个 Base64 解码器都应该做的那样),则剩下 339 个字符。然而,有效的 Base64 数据必须是 4 个字符的倍数。

有趣的是,您的数据不包含加号。我怀疑它曾经包含它们,但它们可能已被传输中的某个地方所取代。如果用加号替换所有空格,则 Base64 数据有效,解码后的数据长度为 256 字节:344 个字符 / 4 * 3 - 2 个填充字符。

我进一步怀疑 Base64 数据在没有正确 URL 编码的 URL 中使用。这是缺少加号的可能原因。请注意,Base64 编码数据不是 URL 安全的。加号和等号都需要转义。

于 2013-08-06T17:46:08.807 回答