Le décodage et l'Encodage de problème. Différentes implémentations de Base64 de la Classe android.util.* et java.util.*?
Je suis en train d'écrire une Application qui effectue les opérations suivantes avec un String str:
encode(encrypt(encode(stringToBytearray(str))));
Le Serveur reçoit la Chaîne encodée en Base64, qui est ensuite décodé -> décrypté -> décodé, pour obtenir l'envoyé String str à partir de l'App.
Malheureusement il ne marche pas pour toutes les Chaînes, de Chaînes longues mener à une longue Chaîne Base64 et mon Serveur jette l'Exception suivante:
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)
La Chaîne a le format "[string, string, ..., string]" sans "s.
Comme je l'ai mentionné ci-dessus, pour les Chaînes qui ne sont pas trop long (désolé je ne peux pas quantifier la longueur encore), cela fonctionne. Donc, je pense que j'ai mis en œuvre ce droit.
Ce qui est bizarre, c'est que si je n'ai pas l'envoyer, mais decode(déchiffrer(decode(stringToBytearray(str)))); la Chaîne sur l'Appareil lui-même, tout fonctionne parfaitement.
Ma Configuration:
JDK 7, eclipse (adt-bundle, développement android) (Windows 7)
JDK 8, eclipse ("normal" java) (Linux (xubuntu))
Est-ce parce que les deux Classes (Base64) sont mis en œuvre diffrently? Si oui, comment puis-je le faire fonctionner?
Voici le Codage/Décodage des Méthodes:
Encodage (Appareil: sur 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);
}
De décodage (Serveur: sur Linux, jdk 8):
import java.util.Base64
public byte[] decode(byte[] bytearrayToEncode){
return Base64.getUrlDecoder().decode(bytearrayToDecode);
}
Les chaînes sont toutes De-/Encodé avec le même jeu de caractères (utf-8)!
Encodage/Décodage: Base64
De chiffrement: AES
Si vous avez besoin de plus d'Informations, il suffit de demander, mais je pense que j'ai fourni toutes les informations nécessaires.
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;
}
Est votre serveur de règlage de la requête param lorsque la longueur est trop grande? Juste essayer de reprendre le reçu de base-64 message et vérifier si elles sont exactement égaux. Parce que tronquée de la chaîne peut ne plus être valable en Base 64 message chiffré.
Je viens de découvrir, que le deuxième appel de coder, ne s'applique pas (même si j'ai pensé que j'ai vérifié). Jusqu'à présent, merci pour toutes les suggestions! Je vais essayer de comprendre pourquoi ça ne marche pas.
J'ai un peu de mal avec les différents codeurs en langage java.util.Base64. Avez-vous essayé en Base64.getDecoder() au lieu de Base64.getUrlDecoder()?
OriginalL'auteur user3469811 | 2014-03-27
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser JSONObjects pour envoyer la Chaîne Base64 pour le serveur. Si oui, alors la JSONObject permettra d'ajouter " \ " échapper les caractères de la chaîne qui sont illégales en Base64 caractères. Tout ce que vous devez faire est de
sur la fin du serveur avant d'utiliser les acquis de la chaîne.
Facultatif
Également sur le côté serveur utiliser
et
String result = DatatypeConverter.printBase64Binary(bytearrayToDecode);
à la place.
Il ne sera pas seulement obtenir le travail fait, mais est beaucoup plus rapide à l'encodage/décodage (comme comparées ici).
OriginalL'auteur Mohsin Ali
Si vous avez un espace dans votre chaîne codée, ce qui est un caractère illégal en base64. Si vous l'enlever, il génère toujours la même image/données dans le convertisseur est lié à, et peut être décodé par votre code.
Mise à JOUR:
Certains décodeurs (comme celle que vous avez lié, ou Base64.getMimeDecoder() en Java) ignorer les caractères illégaux, d'autres (comme en Base64.getDecoder()) ne leur permettent pas.
OriginalL'auteur Anand Varkey Philips
Utiliser pour encoder:
et décoder:
OriginalL'auteur Leonardo Borges