2013-07-24 252 views
4

我意識到這可能更多是一個普通的java問題,但由於它運行在Notes \ Domino環境中,我以爲我會首先檢查該社區。java解碼base64字符串

摘要:

我似乎不能夠字符串解碼:dABlAHMAdAA =使用lotus.domino.axis.encoding.Base64或sun.misc.BASE64Decoder

我知道原文是:test

我通過解碼確認在http://www5.rptea.com/base64/它看起來是UTF-16。

作爲簡單的測試,即使用以下:

String s_base64 = "dABlAHMAdAA="; 
byte[] byte_base64 = null; 
String s_decoded = ""; 

byte_base64 = new sun.misc.BASE64Decoder().decodeBuffer(s_base64); 
s_decoded = new String(byte_base64, "UTF-16"); 
System.out.println("Test1: " + s_decoded); 

byte_base64 = lotus.domino.axis.encoding.Base64.decode(s_base64); 
s_decoded = new String(byte_base64, "UTF-16"); 
System.out.println("Test2: " + s_decoded); 

System.out.println("========= FINISH."); 

我得到的輸出:
測試1:????
Test2:????

如果我創建的字符串爲UTF-8

s_decoded = new String(byte_base64, "UTF-8"); 

它輸出:
牛逼
不會引發錯誤,但它並沒有完成代碼,不會到達「FINISH」 。

詳細

我訪問一個ASMX web服務,在SOAP響應,一些節點包含經編碼的數據的base64。在這個時候,沒有辦法改變服務,所以我不得不XPath和解碼自己。編碼數據是文本或html。如果我通過編碼數據通過http://www5.rptea.com/base64/並選擇UTF-16,它解碼正確,所以我必須做一些不正確的事情。

至於側面說明,我的編碼「測試」:

s_base64 = lotus.domino.axis.encoding.Base64.encode(s_text.getBytes()); 
System.out.println("test1 encodes to: " + s_base64); 

s_base64 = new sun.misc.BASE64Encoder().encode(s_text.getBytes()); 
System.out.println("test2 encodes to: " + s_base64); 

他們都編碼爲:
dGVzdA == ......這,如果你再送入2個解碼器上面,符合市場預期,正確解碼。

如果我轉到上面的網站,並將「test」編碼爲UTF-16,則會得到:dABlAHMAdAA =以確認數據是UTF-16。

這就像數據是真正的base64數據,但解碼器不能識別它。我現在有點難過。

任何指針或意見將受到感謝。

回答

11

該字符串已用UTF-16LE(little-endian)編碼,其中最低有效字節首先被存儲。 Java默認爲big-endian。您需要使用:

s_decoded = new String(byte_base64, "UTF-16LE"); 
+0

如果我能跳直通屏幕,給你一個擁抱,我會的。幾個小時我一直在徘徊。非常感謝。 –

+1

新的字符串(byte_base64,StandardCharsets.UTF_16LE)可能在Java 7之後 – naveejr

0

我用你的樣品「dABlAHMAdAA =」我的base64解碼在線工具,它好像你缺少了Apache的base64 jar文件 點擊下面的鏈接。

http://www.hosting4free.info/Base64Decode/Base64-Decode.jsp

網站背後的代碼是

import org.apache.commons.codec.binary.Base64; 

public class base64decode 

{ 

public static void main(String[] args) throws UnsupportedEncodingException 
    { 


    byte[] decoded = Base64.decodeBase64("YWJjZGVmZw==".getBytes()); 
    System.out.println(new String(decoded) + "\n"); 

} 

}