我尝试编码这个字节数组:
[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 版权所有 (c) 1995-2001 Kungliga Tekniska Högskolan(瑞典斯德哥尔摩皇家理工学院)
这是输出:
[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 库以同样的方式工作?
最佳答案
每个Base64 ASCII字符包含6位信息(26 = 64),所以4个Base64字符包含3字节信息。你有 16 个字节,所以一个字节留在末尾,需要 2 个 Base64 字符,并且为了使组最多 4 个字符,添加了两个填充 =
。
注意:JavaSE 8 带来了一个类 Base64来替换周围的几个旧类。
Base64 有几个应用领域,有各种小的变化:可以省略填充,添加换行符以限制行长度,等等。 Java 8 的 Base64 甚至有一个不兼容的 URL 和文件名安全版本的选项,其中 +
和 /
被替换。
关于Java Base64 编码给出与 C base64 编码不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26275738/