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.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库以同样的方式工作
# 1 楼答案
每个Base64 ASCII字符包含6位信息(26=64),因此4个Base64字符包含3个字节的信息。您有16个字节,因此在末尾保留一个字节,需要2个Base64字符,为了使组最多4个字符,添加了两个padding
=
注意:JavaSE8中出现了一个类Base64来替换周围的几个旧类
Base64有几个应用领域,有各种小的变化:可以省略填充,添加换行符以限制行长度,等等。Java8的Base64甚至有一个不兼容的URL和文件名safeversion选项,其中
+
和/
被替换# 2 楼答案
Base64在3字节的块上工作,并且
=
填充将输出大小提高到3的倍数。这个填充是可选的,如果没有,那么您可以在尝试使用Java代码解码之前通过检查数组长度手动添加它