2012-05-24 467 views
11

我一直在试图做一个对象序列化和Base64编码的结果。它适用于Sun的lib:如何使用org.apache.commons.codec.binary.base64对Base64进行编码?

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编码?

+0

哪'Base64'类中的“太阳的lib”你在你的第一个例子中使用? – QuantumMechanic

+0

com.sun.org.apache.xerces.internal.impl.dv.util.Base64 –

回答

22

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

谢谢 - 哑巴我,我应该看到这个:-D –

2

commons-codec home page

编解码器形成为试图集中发力的一个 最终实现的Base64编码的。在编解码器的建议时,大约有34个不同的Java类 ,它们涉及基础架构的CVS 存储库中的Base64编码。雅加达Tomcat项目中的开发人员实施了 原始版本的Base64编解码器,该编解码器已被Commons HttpClient和Apache XML项目的XML-RPC子项目复制。差不多一年后,两个分支版本的Base64显着地相互分离了 。 XML-RPC已经应用了许多修补程序和 修补程序,这些修补程序未应用于Commons HttpClient Base64。 不同的子项目已在各级遵守 不同的实现与RFC 2045

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

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

+0

我会,我很高兴与太阳的*除了*一个没有去标准:http://www.techiegyan.com/2009/01/11/warning-sunmiscbase64encoder-is-sun-proprietary-api-and-may-be-remove-a-future-release /这就是为什么我必须切换,即使我不想要到 –

+2

希望和需要经常分歧,但需要永远胜出。 –

相关问题