[英]Java Base64 MIME decoding/encoding throws away delimiters
我有一個Base64編碼的字符串,看起來像"data:image/png;base64,iVBORw0K"
。 我正在嘗試將其解碼回二進制,然后使用java.util.Base64
其再次編碼為Base64。 奇怪的是,在再次解碼和編碼之后,我將丟失定界符並返回"dataimage/pngbase64iVBORw0I="
。
這是我進行解碼和編碼的方式(用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
也會發生這種情況。 我究竟做錯了什么? 這是預期的行為嗎?
您要處理的字符串看起來像RFC 2397中指定的“數據:” URL的示例
處理這些錯誤之一的正確方法是將其解析為其組件,然后僅解碼經過base64編碼的組件。 這是語法
dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype := [ type "/" subtype ] *( ";" parameter )
data := *urlchar
parameter := attribute "=" value
因此,這表示示例中用逗號表示的所有內容都是非base64數據。 您不能簡單地將整個字符串視為base64,因為它包含在base64編碼方案的任何標准變體中都無效的字符。
此問答討論了Java中的RFC 2397解析器:
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.