2014-10-09 91 views
3

我嘗試編碼此字節數組:的Java Base64編碼給出比C的base64編碼不同的結果

[237, 217, 204, 218, 109, 227, 157, 145, 35, 152, 85, 142, 182, 180, 120, 8] 

使用Java庫org.apache.commons.codec.binary.Base64.encodeBase64org.bouncycastle.util.encoders.Base64.encode這就是結果:

[55, 100, 110, 77, 50, 109, 51, 106, 110, 90, 69, 106, 109, 70, 87, 79, 116, 114, 82, 52, 67, 65, 61, 61] 

(注意雙'='結尾處的填充字符)

使用base64.c Copyright (c) 1995-2001 Kungliga Tekniska Högskolan (Royal Institute of Technology, Stockholm, Sweden)這是輸出:

[55, 100, 110, 77, 50, 109, 51, 106, 110, 90, 69, 106, 109, 70, 87, 79, 116, 114, 82, 52, 67, 66, 72, 114] 

任何人都可以解釋爲什麼嗎?我怎樣才能讓Java/C庫以同樣的方式工作?

+0

我會讀base64作爲文本,因爲這是使用它的要點;)看起來你在最後得到了不同的填充。你知道這是一個問題嗎? Base64不是一個明確的規格。 – 2014-10-09 10:19:11

+1

注意:C代碼是13歲,也許有更新的版本。 – 2014-10-09 10:22:20

回答

0

Base64在3個字節的塊上工作,而=填充用於使輸出大小達到3的倍數。此填充是可選的,如果不存在,則可以通過檢查數組長度,然後嘗試使用Java代碼進行解碼。

1

每個Base64 ASCII字符包含6位信息(2 = 64),所以4個Base64字符包含3個字節的信息。你有16個字節,所以最後需要一個字節,需要2個Base64字符,並且要使該組最多爲4個字符,添加兩個填充=

注意:用JavaSE 8來了一個類Base64來替換幾個較老的類。

Base64有幾個應用領域,有各種各樣的小改動:填充可以省略,換行符可以限制行長,等等。 Java 8的Base64甚至可以選擇不兼容的URL和文件名安全版本,其中+/被替換。