2012-05-24 105 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

希望和需要經常分歧,但需要永遠勝出。 –

相關問題