如何使用 org.apache.commons.codec.binary.base64 对 Java 对象进行 Base64 编码?

2022-09-03 12:46:20

我一直在尝试进行对象序列化和Base64编码结果。它与 Sun 的 lib 一起使用:

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的编码器实现字节Array的正确Base64编码的正确方法是什么?


答案 1

实际上,您正在使用的版本和特定的 Sun 内部版本确实给出了相同的结果。我想你认为他们给出了不同的版本,因为当你这样做时,你正在隐式调用一个数组:commons-codectoString()

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

答案 2

共享资源编解码器主页

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

我认为你的问题是“各种程度”的合规性。

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