我尝试编码这个字节数组:
[237, 217, 204, 218, 109, 227, 157, 145, 35, 152, 85, 142, 182, 180, 120, 8]
使用Java库org.apache.commons.codec.binary.Base64.encodeBase64
和org.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 :(得分: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代码进行解码之前检查数组长度。