Java Base64 编码给出与 C base64 编码不同的结果

标签 java 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 版权所有 (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/

相关文章:

iphone - 图像数据的 Base64 解码问题-iphone

java - Android webview 多个窗口。如何检测是从 html 目标 ="blank"还是从 javascript 创建的窗口?

Java 开发服务器错误地抛出FeatureNotEnabled 异常?

c++ - 关于在 C/C++ 中比较整数和 float / double

c++ - 从双指针在 oct 文件中创建 NDArray

javascript - Cloudinary - 直接调用 API 上传,丢失文件

java - 我如何从这些 JComboBox 中获取两个价格?

java - HQL 或 Criteria 中的 CASE 语句

c++ - 将 C 风格结构与 C++ 混合

json - 如何在golang中对特殊的json字符串进行base64编码?