15

我一直在尝试进行对象序列化,并对结果进行 Base64 编码。它适用于 Sun 的库:

Bean01 bean01 = new Bean01();
bean01.setDefaultValues();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream( baos ).writeObject( bean01 );
System.out.println(Base64.encode(baos.toByteArray()));

这工作正常。但是,我想使用 org.apache.commons.codec.binary.base64 做同样的事情,但这不会返回相同的字符串:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

使用 Apache 的编码器实现 byteArray 的正确 Base64 编码的正确方法是什么?

4

2 回答 2

25

实际上,commons-codec您使用的版本和特定的 Sun 内部版本确实给出了相同的结果。我认为您认为他们提供了不同的版本,因为您toString()在执行此操作时会隐式调用数组:

System.out.println(org.apache.commons.codec.binary.Base64.encodeBase64(baos.toByteArray()));

这绝对不会打印出数组内容。相反,这只会打印出数组引用的地址。

我编写了以下程序来测试编码器。您将从下面的输出中看到给出相同的结果:

import java.util.Random;

public class Base64Stuff
{
    public static void main(String[] args) {
        Random random = new Random();
        byte[] randomBytes = new byte[32];
        random.nextBytes(randomBytes);

        String internalVersion = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.encode(randomBytes);
        byte[] apacheBytes =  org.apache.commons.codec.binary.Base64.encodeBase64(randomBytes);
        String fromApacheBytes = new String(apacheBytes);

        System.out.println("Internal length = " + internalVersion.length());
        System.out.println("Apache bytes len= " + fromApacheBytes.length());
        System.out.println("Internal version = |" + internalVersion + "|");
        System.out.println("Apache bytes     = |" + fromApacheBytes + "|");
        System.out.println("internal equal apache bytes?: " + internalVersion.equals(fromApacheBytes));
    }
}

这是运行它的输出:

Internal length = 44
Apache bytes len= 44
Internal version = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
Apache bytes     = |Kf0JBpbxCfXutxjveYs8CXMsFpQYgkllcHHzJJsz9+g=|
internal equal apache bytes?: true
于 2012-05-25T01:11:20.287 回答
2

commons-codec 主页

Codec 的成立是为了将开发工作集中在 Base64 编码器的一个最终实现上。在 Codec 提出提案时,大约有 34 个不同的 Java 类处理 Base64 编码,分布在 Foundation 的 CVS 存储库中。Jakarta Tomcat 项目的开发人员实现了 Base64 编解码器的原始版本,该版本已被 Commons HttpClient 和 Apache XML 项目的 XML-RPC 子项目复制。近一年后,Base64 的两个分叉版本之间出现了明显的分歧。XML-RPC 应用了许多未应用于 Commons HttpClient Base64 的修复和补丁。不同的子项目在符合 RFC 2045 的不同级别上具有不同的实现。

我认为您的问题是合规性的“不同程度”。

我的建议:选择一个 base64 编码器/解码器并坚持下去

于 2012-05-24T20:38:15.100 回答