Java Base64编码与C Base64编码结果不同

3

我尝试对这个字节数组进行编码:

[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 版权所有(c) 1995-2001 皇家理工学院(瑞典斯德哥尔摩),输出内容如下:

[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作为文本读取,因为这是使用它的重点 ;) 看起来你在结尾处得到了不同的填充。你知道这是个问题吗?Base64不是一个明确定义的规范。 - Peter Lawrey
1
注意:这段 C 代码已经有13年的历史了,也许有更新版本。 - Peter Lawrey
2个回答

1

每个Base64 ASCII字符包含6位信息(26=64),因此4个Base64字符包含3个字节的信息。您有16个字节,因此最后一个字节需要2个Base64字符,并添加两个填充符=以使组成4个字符。

注意:JavaSE 8引入了一个Base64类来代替几个旧类。

Base64有多个应用领域,有各种小变化:可以省略填充,添加换行符以限制行长度等。 Java 8的Base64甚至具有非兼容的URL和文件名安全版本的选项,其中+/被替换。


0

Base64 在处理 3 字节的块时使用,= 填充用于将输出大小增加到 3 的倍数。这种填充是可选的,如果没有,则可以通过在尝试使用 Java 代码解码之前检查数组长度来手动添加它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接