3

我正在使用 Apache Commons 库中的 Base64 编码器。现在要么我的运行时/IDE 发生了一些有趣的事情,要么他们对 Base64 编码(或 Base64 作为规范)的实现是不确定的:

val test = Base64.encodeBase64("hello".getBytes).toString
val test2 = Base64.encodeBase64("hello".getBytes).toString
val test3 = Base64.encodeBase64("hello".getBytes).toString

以上每一项都会产生不同的结果。这是预期的吗?我正在用Scala写这个......

4

2 回答 2

9

您发布的 Scala 代码的等效 Java 代码将是:

String test = Base64.encodeBase64("hello".getBytes()).toString();
String test2 = Base64.encodeBase64("hello".getBytes()).toString();
String test3 = Base64.encodeBase64("hello".getBytes()).toString();

这将打印每个数组对象toString()byte[]数组对象,Base64.encodeBase64("hello".getBytes())这些对象将是不同的对象,因此将不同的输出输出到控制台。它执行类的toString()方法Object,根据 Javadocs 说:

返回对象的字符串表示形式。

Object 类的 toString 方法返回一个字符串,该字符串由对象作为实例的类的名称、at 符号字符“@”和对象的哈希码的无符号十六进制表示形式组成。

要获得正确的String表示,请使用Arrays.toString()方法。打印正确结果的示例 Java 代码如下:

String test = Arrays.toString(Base64.encodeBase64("hello".getBytes()));
String test2 = Arrays.toString(Base64.encodeBase64("hello".getBytes()));
String test3 = Arrays.toString(Base64.encodeBase64("hello".getBytes()));
于 2013-05-25T19:05:53.887 回答
1

在数组上调用 toString() 可能会返回各个数组的 JVM 内存地址,因此每个 Base64.encodeBase64("hello".getBytes()) 将返回不同的数组,并且每个数组上的 toString() 将返回不同的地址.

于 2013-05-25T19:17:07.363 回答