Apache通用base64解码和Sun base64解码

时间:2013-08-06 16:59:54

标签: java base64

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 String的System.out.println。

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

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

1 个答案:

答案 0 :(得分:2)

解码数据无效Base64数据。

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

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

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