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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用org.apache.commons.codec.binary.base64对Java对象进行Base64编码?相关的知识,希望对你有一定的参考价值。

我一直在尝试对象序列化和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编码器实现byteArray的正确Base64编码的正确方法是什么?

答案

实际上,你使用的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
另一答案

来自commons-codec home page

编解码器的形成是为了将开发工作集中在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编码器/解码器并坚持下去

以上是关于如何使用org.apache.commons.codec.binary.base64对Java对象进行Base64编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?