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()?
InformationsquelleAutor user3469811 | 2014-03-27
Schreibe einen Kommentar