Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 23h38   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 46
Points : 11
Points : 11
Par défaut Récupération d'un String d'un JFormattedTextField

Bonsoir,

J'ai une petite question qui va peut-être amené à une grande réponse ..

J'ai un JFormattedTextField qui reçoit via un JFileChooser le chemin d'accès d'un répertoire.
Dans mon code, j'effectue un getText sur ce JFormattedTextField et crypte le String(de retour) avec AES.
La fonction d'encryption d'AES utilise comme paramètre un Byte[] et retourne un Byte[], ainsi je suis obligé d'utiliser getBytes pour passer le String à la fonction d'encryption.
Ensuite, je stocke ce Byte[](que je vais appeller ici cryptedPath) dans un String en faisant :
String s = "";
for (int i = 0; i < cryptedPath.length; i++)
s += (char)cryptedPath[i];
Et pour finir, j'enregistre la classe sérialisé qui contient ce string dans un fichier.
Le soucis, c'est qu'en faisant tout ça, quand je veux rechargé la classe à partir du fichier les chemins d'accès qui contenaient des caractères accentués ne sont pas bien supportés. Quand je réaffiche ces chemins d'accès, les caractères accentués ne s'affichent pas correctement(ils sont remplacés par d'autres caractères bizarre).

Je précise que je suis sur kubuntu.
Je pense personnellement que c'est du à la fonction getBytes. Cette fonction renvoi un byte quand il s'agit d'un caractère normal et 2 bytes quand il s'agit d'un caractère accentué. Du coup, quand je caste mes bytes en char, il n'affiche rien de bon.. forcément. Et je n'ai pas d'idées sur comment résoudre ce problème.

Si vous pouviez m'aider, ce serait vachement cool.

Merci.

Bien à vous,

Moi.
zizoufoot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 23h58   #2
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 46
Points : 11
Points : 11
J'ai oublié de vous mettre le code, je le fais de suite. J'ai enlevé ce qui n'était pas "utile".

Création du JFormattedTextField et du JFileChooser
Code :
1
2
hChamp = new JFormattedTextField();
hChoix = new JFileChooser();
Demande à l'utilisateur de choisir un répertoire et l'enregistre dans hChamp
Code :
hChamp.setText(hChoix.getSelectedFile().getAbsolutePath());
Récupère le contenu de hChamp et le stocke dans un String s
Code :
String s = hChamp.getText();
Crypte s et stocke dans bCrypted
Code :
byte[] bCrypted = aes.crypt(s.getBytes());
Convertit le Byte[] bCrypted en un String sCrypted
Code :
1
2
3
String sCrypted = "";
for (int i = 0; i < bCrypted.length; i++)
	sCrypted += (char)bCrypted[i];
Sauvegarde de la classe(DataCrypt) qui contient ce string
Code :
1
2
ObjectOutputStream  out = new ObjectOutputStream(new FileOutputStream("./datas", false)); 
out.writeObject((DataCrypt)this);
Restauration de la classe et récupération de sCrypted
Code :
1
2
3
4
FileInputStream fichier = new FileInputStream("./datas");
ObjectInputStream ois = new ObjectInputStream(fichier);
DataCrypt dc = (DataCrypt)ois.readObject(); 
sCrypted = dc.sCrypted;
Et pour terminer, décryption de sCrypted et affichage dans hChamp
Code :
1
2
3
4
5
6
7
8
temp = new byte[sCrypted.length()];
for (int j = 0; j < sCrypted.length; j++)
	temp[j] = (byte)sCrypted.charAt(j);
Byte[] byteDecrypted = aes.decrypt(temp);
String stringDecrypted = "";
for (int j = 0; j < byteDecrypted.length; j++)
	stringDecrypted += (char)byteDecrypted[j];
hChamp.setText(stringDecrypted);
zizoufoot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 01h44   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2007
Messages : 46
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 46
Points : 11
Points : 11
Cela fait 2 jours que je suis dessus.
J'ai trouvé la réponse à mon problème par le plus grand des hasards. Enfin "hasards".. J'ai penché pour cette solution sans vraiment trop y croire.
Donc si quelqu'un sait pourquoi ça fonctionne, je suis très très très intéressé par la réponse. Bien que je vois grosso modo pourquoi ça fonctionne.

J'ai modifié
Code :
byte[] bCrypted = aes.crypt(s.getBytes());
par
Code :
byte[] bCrypted = aes.crypt(s.getBytes("ISO-8859-1"));
Et
Code :
1
2
3
4
5
6
7
8
temp = new byte[sCrypted.length()];
for (int j = 0; j < sCrypted.length; j++)
	temp[j] = (byte)sCrypted.charAt(j);
Byte[] byteDecrypted = aes.decrypt(temp);
String stringDecrypted = "";
for (int j = 0; j < byteDecrypted.length; j++)
	stringDecrypted += (char)byteDecrypted[j];
hChamp.setText(stringDecrypted);
par
Code :
1
2
3
4
5
6
temp = new byte[sCrypted.length()];
for (int j = 0; j < sCrypted.length; j++)
	temp[j] = (byte)sCrypted.charAt(j);
Byte[] byteDecrypted = aes.decrypt(temp);
String stringDecrypted = new String(byteDecrypted, 0, byteDecrypted.length, "ISO-8859-1");
hChamp.setText(stringDecrypted);
zizoufoot est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h55.


 
 
 
 
Partenaires

Hébergement Web