2012-07-23 102 views
8

嘗試將byte[]轉換爲使用 org.apache.commons.codec.binary.Base64 ..For這是我的Java代碼看起來像的base64字符串:轉換字節數組的base64字符串的Java

base64String = Base64.encodeBase64URLSafeString(myByteArray); 

,但我看到的是一些無效的產生base64字符字符串.. ScreenShot

爲什麼我在我生成的base64字符串中看到這些____行? 這是一個有效的字符串嗎? 注意生成的字符串的長度可以被四除。

+1

你試試你的解碼輸出?另外,您是否在URL中使用編碼的base64數據。僅當base64編碼進入http/get或其他與url相關的操作時才使用URLSafe版本。 – maasg 2012-07-23 12:48:45

+0

http://en.wikipedia.org/wiki/Base64#URL_applications – nullpotent 2012-07-23 12:48:47

+0

這可能有助於http://stackoverflow.com/questions/6265912/javax-xml-binds-base64-encoder-decoder-eats-last-two-字符串 – tsm 2012-07-23 12:48:53

回答

2

,這會很有幫助

sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); 
encoder.encode(byteArray); 
+14

這是不好的建議---'sun.misc'包層次結構不適合公共使用。 – 2012-07-23 12:56:31

+0

我不想用'sun.misc'去尋找 – 2012-07-23 12:59:21

0

你有(至少)的base64的兩種口味,原來除了字母數字字符使用「+」和「/」,而「網址安全「one,使用」 - 「和」_「,以便內容可以包含在URL中(或用作文件名,btw)。

它看起來像你使用的base64編碼器已變成「網址安全模式」。

apache's javadoc for URLSafeString()

哦,'_'被以base64字母表的最後一個字符,看到的"____"串意味着你已經編碼0XFFFFFF大塊......,就像看「AAAAAA」意味着有很多的連續零。

如果你想確信這是一個正常的情況,只需選擇你最喜歡的十六進制翻車機/編輯器,並檢查你的二進制輸入看起來像什麼。

+0

看起來有效的評論是的,我已經得到了'/'並用'encodeBase64URLSafeString'重新規劃了econding方法來避免斜線。然後它都以'_'開頭。所有我需要知道的是上面是一個有效的base64字符串?請建議。 – 2012-07-23 13:04:14

+0

你問的字符串是否與[0-9A-Za-z _-] +或[0-9A-Za-z/+] +匹配?這聽起來像一個正則表達式的工作。 – PypeBros 2012-07-24 08:57:52

0

通過下面的過程中,你能字節數組轉換爲Base64

// Convert a byte array to base64 string 
    byte[] bytearray= new byte[]{0x12, 0x23}; 
    String s = new sun.misc.BASE64Encoder().encode(bytearray); 

    // Convert base64 string to a byte array 
    bytearray = new sun.misc.BASE64Decoder().decodeBuffer(s); 

編輯:

請查看以下鏈接引導commons apache

+0

'sun.misc.BASE64Decoder()'?爲什麼使用Apache公用程序 – 2012-07-23 12:59:04

+2

sun.misc是Sun的java/javax包實現的內部組件。不能保證它總是會在那裏(尤其是在不同的JVM上),也不能保證它的接口在JVM的不同版本afaik中保持不變。 – PypeBros 2012-07-24 09:02:42

2

你試過用encodeBase64String方法而不是使用encodeBase64URLSafeString

encodeBase64URLSafeString:

器利用的base64算法 的URL安全變化的二進制數據,但不塊的輸出。網址安全的變體會發出 - 而不是+和/字符。

encodeBase64String:

器利用BASE64算法二進制數據,但不組塊中的 輸出。注意:我們將此方法的行爲從多行 分塊(commons-codec-1.4)更改爲單分塊非分塊 (commons-codec-1.5)。

來源:org.apache.commons.codec.binary.Base64 javadoc

0

使用

String sCert = javax.xml.bind.DatatypeConverter.printBase64Binary(pk); 
相關問題