我有一个Base64编码的字符串,看起来像collectionEvents
。我试图将其解码回二进制文件,然后使用"data:image/png;base64,iVBORw0K"
将其再次编码为Base64。奇怪的是,再次解码和编码后,我会丢失分隔符并返回java.util.Base64
。
这就是我如何进行解码和编码(用Scala编写,但你明白了):
"dataimage/pngbase64iVBORw0I="
以下是一个示例:https://scalafiddle.io/sf/TJY7eeg/0
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)))
也会发生这种情况。我究竟做错了什么?这是预期的行为吗?
答案 0 :(得分: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"
答案 1 :(得分:0)
您尝试处理的字符串看起来像RFC 2397
中指定的“data:”网址示例处理其中一个的正确方法是将其解析为其组件,然后解码仅 base64编码的组件。这是语法
dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
mediatype := [ type "/" subtype ] *( ";" parameter )
data := *urlchar
parameter := attribute "=" value
因此,这表示示例中的逗号都是非base64数据。您不能简单地将整个字符串视为base64,因为它包含在base64编码方案的任何标准变体中无效的字符。
本Q& A讲述了Java中的RFC 2397解析器: