Problème de conversion string to short
Résolu/Fermé
thiecret
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
-
28 mai 2013 à 02:12
thiecret Messages postés 6 Date d'inscription mardi 28 mai 2013 Statut Membre Dernière intervention 30 mai 2013 - 28 mai 2013 à 22:01
thiecret Messages postés 6 Date d'inscription mardi 28 mai 2013 Statut Membre Dernière intervention 30 mai 2013 - 28 mai 2013 à 22:01
A voir également:
- Problème de conversion string to short
- Qwerty to azerty - Guide
- Video to video - Télécharger - Conversion & Codecs
- Conversion bytes en mo ✓ - Forum Webmastering
- Majuscule to minuscule - Guide
- Conversion m3 en m - Forum Programmation
5 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
28 mai 2013 à 06:06
28 mai 2013 à 06:06
"Ce programme fonctionne très bien en C++."
Mais en C++ les caractères ne sont pas en Unicode, alors que Java si !
Ce qui change (entre autre) c'est que les char en C++ sont sur 1 octet alors qu'en Java ils sont sur 2 octets. Du coup les conversions char/byte/short ne fonctionnent pas pareil et comme tu as tout mélangé ça ne marche pas. Sans parler de l'ordre des caractères qui est différent...
Regarde la documentation : Byte Encodings and Strings
Remarque : j'aurais d'autres choses à te dire sur ton code mais vu l'heure très matinale je m'arrêterais là, j'y reviendrais peut-être plus tard...
Mais en C++ les caractères ne sont pas en Unicode, alors que Java si !
Ce qui change (entre autre) c'est que les char en C++ sont sur 1 octet alors qu'en Java ils sont sur 2 octets. Du coup les conversions char/byte/short ne fonctionnent pas pareil et comme tu as tout mélangé ça ne marche pas. Sans parler de l'ordre des caractères qui est différent...
Regarde la documentation : Byte Encodings and Strings
Remarque : j'aurais d'autres choses à te dire sur ton code mais vu l'heure très matinale je m'arrêterais là, j'y reviendrais peut-être plus tard...
thiecret
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
28 mai 2013 à 11:14
28 mai 2013 à 11:14
Hello,
Merci pour ta réponse, c'est très gentil. Je vais regarder et je redonnerai des nouvelles quand j'aurai réussi à corriger mes erreurs. Je veux bien que tu me fasses tes remarques complémentaires.
A bientôt.
Merci pour ta réponse, c'est très gentil. Je vais regarder et je redonnerai des nouvelles quand j'aurai réussi à corriger mes erreurs. Je veux bien que tu me fasses tes remarques complémentaires.
A bientôt.
thiecret
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
28 mai 2013 à 13:44
28 mai 2013 à 13:44
RE:
Merci beaucoup pour ton aide. La solution était toute simple :)
Yesssss !!!! Coooool !!!!!!! Géniale !!!!!!!
en fait, j'ai tout mis en byte comme tu m'as dit et ensuite à la place de recreer mon String avec une boucle "for" j'ai mis mon tableau de byte dans un "new String(byte[] tbl) ;" et voila, plus de problème.
Si tu as des remarque concerant mon code, je suis preneur.
Encore merci.
Merci beaucoup pour ton aide. La solution était toute simple :)
Yesssss !!!! Coooool !!!!!!! Géniale !!!!!!!
en fait, j'ai tout mis en byte comme tu m'as dit et ensuite à la place de recreer mon String avec une boucle "for" j'ai mis mon tableau de byte dans un "new String(byte[] tbl) ;" et voila, plus de problème.
Si tu as des remarque concerant mon code, je suis preneur.
Encore merci.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
28 mai 2013 à 19:28
28 mai 2013 à 19:28
Alors mes remarques :
1) en Java, et en POO en général, il faut séparer dans des classes spécifiques tout ce qui peux l'être. Il ne doit pas y avoir de classe fourre-tout. Ici tu devrais au minimum avoir une classe de Test distincte de ta classe Encryption.
2) il faut aussi distinguer dans tes méthodes, celles qui ont vraiment besoin d'un objet pour fonctionner. Or ici, je pense que toutes tes méthodes peuvent être static, c'est à dire ne dépendre d'aucun objet.
Voici à quoi pourrait ressembler la classe de Test avec mes deux premières remarques :
Ensuite, on va rentrer dans le vif du sujet, avec tes méthodes de traitement de String, même si tu as déjà dû corriger quelques problèmes.
3) l'utilisation des short est maladroite dans tout le code, d'ailleurs de manière générale, dans un code Java tu devrais très rarement avoir à utiliser le type short.
Ici, c'est des byte qu'il faut utiliser ce qui réduit considérablement ton code, car tu n'a plus à faire de conversions autre que byte[] et String ce qui se fait tout seul grâce à la classe String.
4) tu as un long test if très lourd dans ta méthode crypt, mais en fait il ne sert à rien avec les byte, car tu peux faire "x-y" aussi bien si x<y que si x>y, Java fera automatiquement le +256 si les bornes limites sont atteintes (d'ailleurs pour les byte ce ne sont pas 0 et 255, mais -128 et +127). Cependant, pour faire ce genre d'opérations on peut directement utiliser des opérateurs bit à bit qui sont plus rapide, en l'occurrence ici l'utilisation d'un XOR qui s'écrit avec le symbole ^
5) les méthodes de cryptage et de décryptage sont rigoureusement identiques, personnellement ça ne me gène pas trop de conserver les deux méthodes (l'utilisateur n'a pas à savoir qu'elles sont identiques), mais par contre il faut éviter d'avoir deux fois le même code. Il serait bon de faire une petite méthode privée pour mutualiser ce traitement.
Voici à quoi pourrait ressembler la classe Encryption en tenant compte de mes remarques (c'est beaucoup plus simple !)
6) concernant les conventions de nommages en Java, les tirets "_" ne devraient pas être utilisés dans les noms de variables, méthodes, ou classes. Pour ces élements, la séparation entre deux mots du nom se fait par la présence d'une lettre majuscule en début de mot, exemple : maVariable, maMethode, MaClasse.
Les seuls noms pour lesquels on devrait utiliser "_" c'e sont les constantes car elles sont écrites complètement en majuscules, exemple : MA_CONSTANTE
1) en Java, et en POO en général, il faut séparer dans des classes spécifiques tout ce qui peux l'être. Il ne doit pas y avoir de classe fourre-tout. Ici tu devrais au minimum avoir une classe de Test distincte de ta classe Encryption.
2) il faut aussi distinguer dans tes méthodes, celles qui ont vraiment besoin d'un objet pour fonctionner. Or ici, je pense que toutes tes méthodes peuvent être static, c'est à dire ne dépendre d'aucun objet.
Voici à quoi pourrait ressembler la classe de Test avec mes deux premières remarques :
public class Test { public static void main(String[] args) { String key = "Salut"; String strToCrypt = "Le texte à chiffrer est bientôt tout bon, j'espère que tout va fonctionner"; System.out.println(strToCrypt); String strCrypt = Encryption.encrypt(strToCrypt, key); System.out.println(strCrypt); String strDecrypt = Encryption.decrypt(strCrypt, key); System.out.println(strDecrypt); System.out.println(strToCrypt.equals(strDecrypt)); } }
Ensuite, on va rentrer dans le vif du sujet, avec tes méthodes de traitement de String, même si tu as déjà dû corriger quelques problèmes.
3) l'utilisation des short est maladroite dans tout le code, d'ailleurs de manière générale, dans un code Java tu devrais très rarement avoir à utiliser le type short.
Ici, c'est des byte qu'il faut utiliser ce qui réduit considérablement ton code, car tu n'a plus à faire de conversions autre que byte[] et String ce qui se fait tout seul grâce à la classe String.
4) tu as un long test if très lourd dans ta méthode crypt, mais en fait il ne sert à rien avec les byte, car tu peux faire "x-y" aussi bien si x<y que si x>y, Java fera automatiquement le +256 si les bornes limites sont atteintes (d'ailleurs pour les byte ce ne sont pas 0 et 255, mais -128 et +127). Cependant, pour faire ce genre d'opérations on peut directement utiliser des opérateurs bit à bit qui sont plus rapide, en l'occurrence ici l'utilisation d'un XOR qui s'écrit avec le symbole ^
5) les méthodes de cryptage et de décryptage sont rigoureusement identiques, personnellement ça ne me gène pas trop de conserver les deux méthodes (l'utilisateur n'a pas à savoir qu'elles sont identiques), mais par contre il faut éviter d'avoir deux fois le même code. Il serait bon de faire une petite méthode privée pour mutualiser ce traitement.
Voici à quoi pourrait ressembler la classe Encryption en tenant compte de mes remarques (c'est beaucoup plus simple !)
public class Encryption { private static String shift(String str, String key) { byte[] tabVal = str.getBytes(); byte[] tabKey = key.getBytes(); for (int i=0, nVal=tabVal.length, nKey=tabKey.length; i<nVal; i++) tabVal[i] = (byte) (tabVal[i] ^ tabKey[i%nKey]); return new String(tabVal); } public static String encrypt(String toCrypt, String key) { return shift(toCrypt,key); } public static String decrypt(String toDecrypt, String key) { return shift(toDecrypt,key); } }
6) concernant les conventions de nommages en Java, les tirets "_" ne devraient pas être utilisés dans les noms de variables, méthodes, ou classes. Pour ces élements, la séparation entre deux mots du nom se fait par la présence d'une lettre majuscule en début de mot, exemple : maVariable, maMethode, MaClasse.
Les seuls noms pour lesquels on devrait utiliser "_" c'e sont les constantes car elles sont écrites complètement en majuscules, exemple : MA_CONSTANTE
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
thiecret
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
28 mai 2013 à 22:01
28 mai 2013 à 22:01
Merci pour toutes ces remarques, je vais corriger tout ca. :)
A bientôt.
A bientôt.