的Java Base64编码给出比C的base64编码不同的结果

问题描述:

我尝试编码此字节数组:的Java Base64编码给出比C的base64编码不同的结果

[237, 217, 204, 218, 109, 227, 157, 145, 35, 152, 85, 142, 182, 180, 120, 8] 

使用Java库org.apache.commons.codec.binary.Base64.encodeBase64org.bouncycastle.util.encoders.Base64.encode这就是结果:

[55, 100, 110, 77, 50, 109, 51, 106, 110, 90, 69, 106, 109, 70, 87, 79, 116, 114, 82, 52, 67, 65, 61, 61] 

(注意双'='结尾处的填充字符)

使用base64.c Copyright (c) 1995-2001 Kungliga Tekniska Högskolan (Royal Institute of Technology, Stockholm, Sweden)这是输出:

[55, 100, 110, 77, 50, 109, 51, 106, 110, 90, 69, 106, 109, 70, 87, 79, 116, 114, 82, 52, 67, 66, 72, 114] 

任何人都可以解释为什么吗?我怎样才能让Java/C库以同样的方式工作?

+0

我会读base64作为文本,因为这是使用它的要点;)看起来你在最后得到了不同的填充。你知道这是一个问题吗? Base64不是一个明确的规格。 – 2014-10-09 10:19:11

+1

注意:C代码是13岁,也许有更新的版本。 – 2014-10-09 10:22:20

Base64在3个字节的块上工作,而=填充用于使输出大小达到3的倍数。此填充是可选的,如果不存在,则可以通过检查数组长度,然后尝试使用Java代码进行解码。

每个Base64 ASCII字符包含6位信息(2 = 64),所以4个Base64字符包含3个字节的信息。你有16个字节,所以最后需要一个字节,需要2个Base64字符,并且要使该组最多为4个字符,添加两个填充=

注意:用JavaSE 8来了一个类Base64来替换几个较老的类。

Base64有几个应用领域,有各种各样的小改动:填充可以省略,换行符可以限制行长,等等。 Java 8的Base64甚至可以选择不兼容的URL和文件名安全版本,其中+/被替换。