Decoding und Encoding-Problem. Verschiedene Implementierungen der Base64-Klasse in android.util.* und java.util.*?
Ich Schreibe eine App, die Folgendes macht mit einem gegebenen String str:
encode(encrypt(encode(stringToBytearray(str))));
Erhält der Server die Base64-kodierten String, der dann dekodiert -> entschlüsselt -> dekodiert, um die gesendete Zeichenfolge str aus der App.
Leider es doesnt Arbeit für alle Strings, lange Strings führen zu einer langen Base64-String und mein Server wird die folgende Ausnahme:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character 5b
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at Main.decode(Main.java:113)
at Main.main(ain.java:33)
Der String hat das format "[string, string, ..., string]", ohne "s.
Wie ich oben erwähnt, für Saiten, die nicht zu lang sind (sorry ich kann nicht quantifizieren, die Länge noch nicht), das funktioniert. Also ich denke, dass ich es richtig umgesetzt.
Was komisch ist, dass wenn ich nicht senden, aber decodieren(entschlüsseln(decodieren(stringToBytearray(str)))); die Zeichenfolge auf dem Gerät selbst, es funktioniert alles perfekt.
Mein Setup:
JDK 7, eclipse (adt-bundle, android development) (Windows 7)
JDK 8 und eclipse ("normale" java -) (mit Linux (xubuntu))
Ist es, weil beide Klassen (Base64) umgesetzt werden diffrently machen? Wenn ja, wie kann ich machen, damit es funktioniert?
Hier sind die Encoding - /Decoding-Methoden:
Kodierung (Device: unter Windows 7, adt-bundle, Android-Dev, jdk 7):
import android.util.Base64
public byte[] encode(byte[] bytearrayToEncode){
return Base64.encode(bytearrayToEncode, Base64.NO_WRAP|Base64.URL_SAFE);
}
Decodierung (Server: Linux, jdk 8):
import java.util.Base64
public byte[] decode(byte[] bytearrayToEncode){
return Base64.getUrlDecoder().decode(bytearrayToDecode);
}
Saiten sind alle De-/Codiert mit dem gleichen Zeichensatz (utf-8)!
Kodierung/Dekodierung: Base64
Crypto: AES
Wenn du mehr Informationen benötigst, einfach Fragen, aber ich denke, sofern ich alle nötigen Informationen.
Edit:
public String bytearrayToString(byte[] bytearray){
String str = null;
try {
str = new String(bytearray, "UTF-8");
} catch (UnsupportedEncodingException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
public byte[] stringToBytearray(String str){
byte[] bytearray = null;
try {
bytearray = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return bytearray;
}
- 0x5b ist [, und, wie ich sagte, die String-format [string, ..., string]. Aber warum macht alle encoding/decoding-Arbeit auf dem Gerät, aber nicht auf den Server, wenn der String zu lang ist. (ich Vergleich die beiden langen Ketten, und Sie sind gleich)
- Ist Ihr server trimmen die Abfrage param, wenn die Länge zu groß ist? Versuchen Sie, nur das echo der empfangenen base-64-Nachricht und prüfen Sie, ob Sie genau gleich. Weil abgeschnitten-Zeichenfolge kann nicht länger eine gültige Base-64-verschlüsselten Nachricht.
- Ich habe gerade herausgefunden, dass der zweite Aufruf von encode, gilt nicht (obwohl ich dachte, ich habe es). So weit, vielen Dank für alle Vorschläge! Ich werde versuchen, herauszufinden, warum nicht.
- Ich kämpfte ein wenig mit den verschiedenen Encoder in java.util.Base64. Haben Sie versucht, Base64.getDecoder() anstelle von Base64.getUrlDecoder()?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie JSONObjects zum senden der Base64-Zeichenfolge an den server. Wenn ja, dann ist das JSONObject wird, fügen Sie " \ " escape-Zeichen zu der Zeichenkette, die die Base64-Zeichen. Alles, was Sie tun müssen, ist
auf dem server vor der Verwendung des erworbenen string.
Optional
Auch auf der server-Seite verwenden
und
String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);
statt.
Wird es nicht nur den job zu erledigen, aber ist viel schneller bei Codierung/Decodierung (als Benchmark hier).
Wenn Sie einen Platz in Ihrem codierte Zeichenfolge, die eine illegale Zeichen in base64. Wenn Sie es entfernen, es noch erzeugt das gleiche Bild/Daten in den Wandler verbunden, und kann jetzt decodiert werden, die von Ihrem code ab.
UPDATE:
Manche Decoder (wie die, die Sie verknüpft, oder Base64.getMimeDecoder() in Java) ignorieren Sie ungültige Zeichen, andere (wie Base64.getDecoder()) erlaubt es Ihnen nicht.
Verwenden Sie zum Kodieren:
- und entschlüsseln: