Java Base64 MIME解码/编码抛弃了分隔符

时间:2017-06-08 11:04:47

标签: java scala base64

我有一个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))) 也会发生这种情况。我究竟做错了什么?这是预期的行为吗?

2 个答案:

答案 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解析器: