有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.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) 个答案

  1. # 1 楼答案

    每个Base64 ASCII字符包含6位信息(26=64),因此4个Base64字符包含3个字节的信息。您有16个字节,因此在末尾保留一个字节,需要2个Base64字符,为了使组最多4个字符,添加了两个padding=

    注意:JavaSE8中出现了一个类Base64来替换周围的几个旧类

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

  2. # 2 楼答案

    Base64在3字节的块上工作,并且=填充将输出大小提高到3的倍数。这个填充是可选的,如果没有,那么您可以在尝试使用Java代码解码之前通过检查数组长度手动添加它