IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

int vers hexa


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut int vers hexa
    Bonjour,

    je dois convertir un nombre entier en 4 octets hexadecimaux , et le stocker dans un tableau de char.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int valeur=189; // 00 00 00 BD en hexa
     
    	String test=String.format("%04X", valeur);
    je souhaiterai avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //tab[0] = 0x00;
    //tab[1] = 0x00;
    //tab[2] = 0x00;
    //resultat[3] = 0xBD;
    comment faire s ' il vous plait ?

    Merci bien

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ben tu splitte ton int en 4 et t'appelle 4 fois format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int val = ....;
    String[] tab = new String[]{
    String.format("%01X", val&0XFF);
    String.format("%01X", (val&0XFF00)>>> 8 );
    String.format("%01X", (val&0XFF0000)>>> 16 );
    String.format("%01X", (val&0XFF000000)>>> 24 );
    }

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Euh, d'après ce qu'il souhaite avoir, c'est juste une question de split son entier en 4 octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char[] tab = new char[] {
      (char)((val >> 24) & 0xFF),
      (char)((val >> 16) & 0xFF),
      (char)((val >> 8) & 0xFF),
      (char)(val & 0xFF)
    };
    Bien sûr, l'hexadécimal n'a rien à voir là-dedans (à part pour faire le masque sur 0xFF, qui pourrait tout aussi bien être 255 à la place).

    Bien sûr aussi, il vaut mieux a priori stocker ça dans un byte[] que dans un char[]. Voire se passer de faire ça, tout court.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais, sa question est pas claire en fait

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Merci de votre aide et désolé de m ' être mal exprimé mais a vrai dire , je suis un peu confus moi aussi ( je débute sur tout ce qui est octet et binaire).

    Je n ' ai d ' ailleurs pas compris le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char[] tab = new char[] {
      (char)((val >> 24) & 0xFF),
      (char)((val >> 16) & 0xFF),
      (char)((val >> 8) & 0xFF),
      (char)(val & 0xFF)
    };
    que représente les "(val >> 24) & 0xFF) " ?
    Aussi quel est la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (String.format("%x", c).toUpperCase()
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(Integer.toHexString(c).toUpperCase());
    dans ce code( j ' ai fait un tableau de byte comme me l ' a conseillé thelvin)
    car le IntegerTohexString me rajoute plein de FFF alors que le string.format me met ca bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    byte[] tab = new byte[] {
    			  (byte)((valeur >> 24) & 0xFF),
    			  (byte)((valeur >> 16) & 0xFF),
    			  (byte)((valeur >> 8) & 0xFF),
    			  (byte)(valeur & 0xFF)
    			};
     
    	for(byte c:tab)
    	{
    		//System.out.println(c);
    		System.out.println(String.format("%x", c).toUpperCase());
    		System.out.println(Integer.toHexString(c).toUpperCase());
    	}
    merci encore de votre aide

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    >> décalage signé de bits vers la droite, & effectue un masque de bits Donc

    ((val >> 24) & 0xFF)
    Va mettre en positions 0 - 7 les bits 24-31 (à cause du shift) et en position 8 - 31 des 0 (à cause du masque)


    Pour la différence:
    format va utiliser le type réel (byte) pour faire le formatage. L'affichage sera donc correct. Ainsi, le byte -107, qui s'écrite 0x95 sera correctement affiché.

    Integer.toHexString, comme on peux s'en douter, travaille exclusivement avec des int. Donc java va d'abord promouvoir -107 (byte) en -107 (int). On travaille en arithmétique signée et la valeur est préservée par la promotion, ce qui se fait, en complément à 2, par la propagation du bit de signe jusqu'à la position 31. En entier, donc, -107 c'est 0xFFFFFF95. Pour plus de détails, rechercher de la littérature sur l'arithmétique signée en informatique et le complément à 2

    edit: et pour t'en convaincre, regarde le résultat de ces lignes avec un nombre négatif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    System.out.println(String.format("%x", c).toUpperCase());
    System.out.println(String.format("%x", (short)c).toUpperCase());
    System.out.println(String.format("%x", (int)c).toUpperCase());
    System.out.println(String.format("%x", (long)c).toUpperCase());

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup

    Je garde ce topic en favori , j ' ai beaucoup plus appris que dans mes cours d ' infos.

    J ' ai une dernière question:

    J ' essaye d ' enregistrer le contenu du tableau de byte dans un fichier sous format ASCII , mais ca ne me l ' enregistre que sous format binaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class TestOctet {
    	static byte[]  tab;
     
    	public byte[] construireTableauByte(int valeur)
    	{
    		  tab = new byte[] {
    				  (byte)((valeur >> 24) & 0xFF),
    				  (byte)((valeur >> 16) & 0xFF),
    				  (byte)((valeur >> 8) & 0xFF),
    				  (byte)(valeur & 0xFF)
    				};
     
    		return tab;
    	}
     
    	public void enregistrerFichier(byte[] tab,String nomFichier)
    	{
    		File fichier = new File(nomFichier);
     
    		try
    		{ 
     
    		   FileOutputStream f= new FileOutputStream(fichier);
    		   BufferedOutputStream out = new BufferedOutputStream(f);
     
    		   out.write(tab); 
    		   out.flush();
    		   out.close(); 
     
    		 } 
    		catch (IOException e) {;}
    	}
     
    public static void main(String[] args) throws IOException {
    	TestOctet test=new TestOctet();
    	int valeur=223;
    	int valeur2=2;
    	int valeur3=11;
    	List<Integer> liste=new ArrayList<Integer>();
    	liste.add(valeur);
    	liste.add(valeur2);
    	liste.add(valeur3);
     
    	StringBuffer buffer=new StringBuffer();
    	for(Integer parcours :liste)
    	{	
    		tab=test.construireTableauByte(parcours);
    		buffer.append(tab);
     
     
    	}
     
    	String chaine=buffer.toString();
    	byte[] array=chaine.getBytes("ASCII");
     
    	test.enregistrerFichier(array,"octetText");
     
    }
    }
    Si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.enregistrerFichier(array,"octetText");
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.enregistrerFichier(tab,"octetText");
    ca fonctionne , mais ca ne me récupère que le premier élément de mon arrayList dans mon fichier....

    Quel est la différence entre les 2 façons de faire( en passant par un string buffer pour tout récuperer d ' un coup et en passant par le tableau de byte[], car je ne vois pas a première vue( j ' ai suivi que la java doc)?

    Merci bien

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    vous voulez trouver quoi exactement dans votre fichier?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Je voudrais y mettre mon tableau de byte constitué de 3 entiers que je stocke dans une arrayList

    Sauf que quant je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int valeur=223;
    	int valeur2=2;
    	int valeur3=11;
    	List<Integer> liste=new ArrayList<Integer>();
    	liste.add(valeur);
    	liste.add(valeur2);
    	liste.add(valeur3);
     
     
    	for(Integer parcours :liste)
    	{	
    		tab=test.construireTableauByte(parcours);
     
    	}
     
     
    	test.enregistrerFichier(tab,"octetText");
    ca ne m ' enregistre que le premier élément(valeur) dans mon fichier, voila pourquoi je demande si il n ' est pas mieux de tout mettre dans un string via Stringbuffer) et d ' appeler la méthode getBytes dessus pour tout récuperer d ' un coup

    Merci encore

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par j2ee60 Voir le message

    ca ne m ' enregistre que le premier élément(valeur)
    Parce que vous appelez la méthode décriture en dehors de la boucle

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Merci de ta réponse , mais j ' avais déja testé dans la boucle et en dehors et aucun changement.
    Ca n ' enregistre que le dernier byte[] construit( normal la boucle for parcourt le dernier élément en dernier)
    Comment faire pour récupérer mes 3 byte[] construit dans mon fichier en une fois ?( c ' est pour ca que je parlais de récupérer les bytes concaténés dans un StringBuffer)



    Merci de ton aide!

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    votre méthode d'écriture ouvre le fichier et l'écrase à chaque vois. Soit vous ouvrez en append à chaque fois (ce qui est affreux du point de vue performances) soit vous ouvrez avant, vous écrivez dans la boucle, vous fermez après.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup tchize , ca fonctionne impec et merci encore pour l ' aide et les explications techniques sur les octets

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. int en hexa
    Par anthonycosson dans le forum C++
    Réponses: 18
    Dernier message: 13/05/2006, 16h09
  2. Réponses: 2
    Dernier message: 24/03/2006, 10h46
  3. Problème de conversion decimal vers Hexa
    Par Elbarto dans le forum C++
    Réponses: 1
    Dernier message: 06/02/2006, 19h37
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  5. [débutant] conversion int en hexa
    Par sergoid dans le forum C++Builder
    Réponses: 6
    Dernier message: 16/05/2003, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo