2017-06-08 93 views
0

我有一個Base64編碼的字符串,看起來像"data:image/png;base64,iVBORw0K"。我試圖將其解碼回二進制文件,然後使用java.util.Base64將它再次編碼爲Base64。奇怪的是,在再次解碼和編碼之後,我會失去分隔符並返回"dataimage/pngbase64iVBORw0I="Java Base64 MIME解碼/編碼拋出分隔符

這是我做的解碼和編碼(Scala寫的,但你的想法):

import java.util.Base64 

val b64mime = "data:image/png;base64,iVBORw0K" 

val decoder = Base64.getMimeDecoder 
val encoder = Base64.getMimeEncoder 

println(encoder.encodeToString(decoder.decode(b64mime))) 

下面是一個例子:https://scalafiddle.io/sf/TJY7eeg/0

這也恰好與javax.xml.bind.DatatypeConverter。我究竟做錯了什麼?這是預期的行爲?

+0

我不認爲解碼器「期望」的任何東西,直到幷包括逗號。仔細閱讀javadoc的方法。該字符串(據說)符合什麼規範? –

回答

0

Base64沒有這些字符。它看起來像解碼器忽略這些無效字符。

@ decoder.decode(";") 
res10: Array[Byte] = Array() 

但是,如果你只是解碼最後一部分,你得到你想要的。

@ decoder.decode("iVBORw0K") 
res9: Array[Byte] = Array(-119, 80, 78, 71, 13, 10) 
@ encoder.encodeToString(res9) 
res12: String = "iVBORw0K" 
0

您要處理看起來像的一個例子串「的數據:」在RFC 2397

正確的方式來處理這些一個指定的URL解析成其組成部分,然後僅解碼 base64編碼的組件。這裏是語法

dataurl := "data:" [ mediatype ] [ ";base64" ] "," data 
    mediatype := [ type "/" subtype ] *(";" parameter) 
    data  := *urlchar 
    parameter := attribute "=" value 

所以這說的是,在你的例子中,逗號的一切都是非base64數據。您不能簡單地將整個字符串視爲base64,因爲它包含在base64編碼方案的任何標準變體中無效的字符。

這個問答&關於RFC會談在Java中2397個解析器: