如何Base64编码,使用org.apache.commons.codec.binary.base6

2019-07-29 13:17发布

我一直试图做一个对象序列化和Base64编码的结果。 它与太阳的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()));

什么是正确的方式来实现的ByteArray的正确Base64编码使用Apache的编码器?

Answer 1:

其实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


Answer 2:

从公共编解码器主页 :

编解码器形成为试图集中发力的一个明确的执行Base64编码的编码器。 在编解码器的建议时,有与Base64编码分布在该基金会的CVS仓库处理大约34个不同的Java类。 在雅加达Tomcat项目开发人员必须实现其已被Commons的HttpClient和Apache XML项目的XML-RPC子项目复制的Base64编码的编解码器的原始版本。 经过近一年的Base64的两个叉版本有显著彼此分歧。 XML-RPC应用了大量的修复和补丁在没有应用到Commons的HttpClient Base64编码。 不同的子项目有不同各级遵守的实现与RFC 2045。

我觉得你的问题是“各种等级”达标。

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



文章来源: How to Base64 encode a Java object using org.apache.commons.codec.binary.base64?