Java Base64编码提供与C base64编码不同的结果

时间:2014-10-09 10:10:14

标签: java 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库以相同的方式工作?

2 个答案:

答案 0 :(得分:1)

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

介意:在JavaSE 8中出现了一个类Base64来替换几个较旧的类。

Base64有几个应用领域,各种变化很小:可以省略填充,添加换行符以限制行长度,等等。 Java 8的Base64甚至可以选择不兼容的URL和文件名safeversion,其中+/被替换。

答案 1 :(得分:0)

Base64适用于3个字节的块,=填充是为了使输出大小达到3的倍数。这个填充是可选的,如果不存在则可以手动添加它通过在尝试使用Java代码进行解码之前检查数组长度。