2017-06-08 8 views
0

"data:image/png;base64,iVBORw0K"のようなBase64エンコード文字列があります。私はそれをバイナリにデコードし、後でjava.util.Base64を使ってBase64に再度エンコードしようとしています。不思議なことに、デコードして再びエンコードした後、デリミタを失い、"dataimage/pngbase64iVBORw0I="に戻ってしまいます。Java Base64のMIMEデコード/エンコーディングでデリミタがスローされる

は、これは私が、デコードおよびエンコード行う方法です(Scalaで書かれたのが、あなたのアイデアを得る):https://scalafiddle.io/sf/TJY7eeg/0

はこれもjavax.xml.bind.DatatypeConverterで発生します:ここで

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

は、私は、デコーダは、原料のいずれかまでとカンマを含め、「期待する」とは思いません。メソッドの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 

この例では、カンマまでのすべてがnon-base64データです。文字列全体をbase64として扱うことはできません。これは、base64エンコーディングスキームの標準バリアントでは無効な文字が含まれているためです。 JavaでRFC 2397件のパーサーについて

このQ &会談:

関連する問題