簡體   English   中英

Java Base64 MIME解碼/編碼會丟棄定界符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM