Problème de conversion string to short

[Résolu/Fermé]
Signaler
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
-
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013
-
Bonjour,

Je suis tout nouveau ici et je rencontre quelque problème lors de la conversion de byte ou de short en char.

J'espère que vous pourrez m'aider. :)

public class Encryption
{
	private short[] tc_encryptedTab ;
	private short[] tc_key ;
	private String tc_decryptedString ;
	
	public static void main(String[] args)
	{
		String strToCrypt = "Le text ä chiffrer est bientot tout bon, j'esp¨ère que tout va fonctionnerés@" ;
		String key = "Salut" ;
		System.out.println(strToCrypt) ;
		Encryption encryption = new Encryption(strToCrypt, key);
		Encryption decryption = new Encryption(encryption.getencryptedTab(), key) ;
		System.out.println(decryption.getdecryptedString()) ;
	}
	public Encryption(String decryptedString, String key)
	{
		tc_decryptedString = decryptedString ;
		tc_key = getShortTab(key) ;
		tc_encryptedTab = getShortTab(tc_decryptedString) ;
		crypt() ;
	}
	public short[] getShortTab(String value)
	{
		byte[] temp = value.getBytes() ;
		short[] shortTab = new short[temp.length] ;
		for(int i = 0 ; i < temp.length ;i++)
		{
			shortTab[i] = (short)(temp[i] & 0xFF) ;
		}
		return shortTab ;
	}
	public String getString(short[] value)
	{
		String stringValue = "" ;
		for(int i = 0 ; i < value.length ; i++)
		{
			stringValue += (char)(value[i]) ;
		}
		return stringValue ;
	}
	public Encryption(short[] decryptedTab, String key)
	{
		tc_key = getShortTab(key) ;
		tc_encryptedTab = decryptedTab ;
		decrypt() ;
		tc_decryptedString = getString(tc_encryptedTab) ;
	}
	public void crypt()
	{
		for(int i = 0; i < tc_encryptedTab.length ; i++)
		{
			if(tc_key[i % tc_key.length] > tc_encryptedTab[i])
			{
				tc_encryptedTab[i] = (short) (256-(tc_key[i % tc_key.length]) + (tc_encryptedTab[i]));
			}
			else
			{
				tc_encryptedTab[i] = (short) (tc_encryptedTab[i] - tc_key[i % tc_key.length]);
			}
		}
	}
	public void decrypt()
	{
		for(int i = 0 ; i < tc_encryptedTab.length ; i++)
		{
			if(tc_key[i % tc_key.length] < tc_encryptedTab[i])
			{
				tc_encryptedTab[i] =  (short) ((tc_encryptedTab[i]) - (256 -(tc_key[i % tc_key.length]))) ;
			}
			else
			{
				tc_encryptedTab[i] = (short) (tc_encryptedTab[i] + tc_key[i % tc_key.length]) ;
			}
		}
	}
	public short[] getencryptedTab()
	{
		return tc_encryptedTab ;
	}
	public String getdecryptedString()
	{
		return tc_decryptedString ; 
	}
}

Normalement, il vous suffit de copier coller le code dans eclipse pour lancer le programme et essayer de comprendre. Ce programme fonctionne très bien en C++.

Mes salutations les meilleures.

5 réponses

Messages postés
16409
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 octobre 2021
2 901
"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...
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013

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.
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013

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.
Messages postés
16409
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 octobre 2021
2 901
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 :

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
Messages postés
6
Date d'inscription
mardi 28 mai 2013
Statut
Membre
Dernière intervention
30 mai 2013

Merci pour toutes ces remarques, je vais corriger tout ca. :)

A bientôt.