2017-06-08 4 views
0

Ich habe eine Base64-kodierte Zeichenfolge, die wie "data:image/png;base64,iVBORw0K" aussieht. Ich versuche, es wieder zu binär zu decodieren und es später erneut in Base64 zu kodieren, java.util.Base64 verwendend. Seltsamerweise würde ich nach dem Decodieren und erneutem Codieren die Begrenzer verlieren und "dataimage/pngbase64iVBORw0I=" zurückbekommen. DieseJava Base64 MIME-Dekodierung/Kodierung löst Delimiter

ist, wie ich tun, um die Decodierung und Codierung (in Scala geschrieben, aber Sie erhalten die Idee):

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))) 

Hier ist ein Beispiel: https://scalafiddle.io/sf/TJY7eeg/0

Dies geschieht auch mit javax.xml.bind.DatatypeConverter. Was mache ich falsch? Ist das das erwartete Verhalten?

+0

Ich glaube nicht, dass der Decoder "erwartet" eine der Sachen bis zu und einschließlich dem Komma. Lesen Sie das Javadoc für die Methode sorgfältig. Welche Spezifikation (angeblich) stimmt diese Zeichenfolge? –

Antwort

0

Base64 enthält diese Zeichen nicht. Es sieht so aus, als ob der Decoder diese ungültigen Zeichen ignoriert.

@ decoder.decode(";") 
res10: Array[Byte] = Array() 

Wenn Sie jedoch nur den letzten Teil dekodieren, bekommen Sie, was Sie wollen.

@ decoder.decode("iVBORw0K") 
res9: Array[Byte] = Array(-119, 80, 78, 71, 13, 10) 
@ encoder.encodeToString(res9) 
res12: String = "iVBORw0K" 
0

Die Zeichenfolge, die Sie mit Blicken wie ein Beispiel eines zu tun versuchen „Daten:“ URL als

Die richtige Art und Weise mit einem von diesen zu beschäftigen in RFC 2397 angegeben ist es Komponenten in seinen analysieren, und dann decodieren nur die Komponente, die Base64 codiert ist. Hier ist die Syntax

dataurl := "data:" [ mediatype ] [ ";base64" ] "," data 
    mediatype := [ type "/" subtype ] *(";" parameter) 
    data  := *urlchar 
    parameter := attribute "=" value 

Also das sagt, dass alles bis zum Komma in Ihrem Beispiel ist nicht base64-Daten. Sie können die gesamte Zeichenfolge nicht einfach als base64 behandeln, da sie Zeichen enthält, die in keiner Standardvariante des base64-Codierungsschemas gültig sind.

Das Q & A spricht über RFC 2397-Parser in Java: