OVH Cloud OVH Cloud

Hexadcimal en java

5 réponses
Avatar
acc
Bonjour,

j'aimerais savoir comment avoir l'équivalent en java de la fonction C
<printf("%x",...)>.
Car, Dans un petit programme je lis un fichier et dois afficher chaque octet
en hexadécimal.

Ce que j'ai fais et qui n'a pas l'air de marcher et qui est de mettre les
données dans un tableau de byte puis de décomposer
chaque octet du tableau comme suis :

{
byte[] data=null;
char[] hexa = new char[16] ;

hexa[0] = '0'; hexa[1] = '1'; hexa[2] = '2'; hexa[3] = '3';
hexa[4] = '4'; hexa[5] = '5'; hexa[6] = '6'; hexa[7] = '7';
hexa[8] = '8'; hexa[9] = '9'; hexa[10] = 'a'; hexa[11] = 'b';
hexa[12] = 'c'; hexa[13] = 'd'; hexa[14] = 'e'; hexa[15] = 'f' ;

[..]
// Séléction, ouverture et lecture du fichier par
<RandomAccessFile.readFully(...)> qui place les données dans tableau de byte
nomé <data>
[..]

// affichage des données du fichier
for(int i=0; i<data.length; i++) {
System.out.println( hexa[ data[i]>>4 ] + hexa[ data[i] & 0x0f ]) ;
// c'est la que c'est pas bon, pourqoi ????
}
}


Merci par avance de m'orienter.


Stéphane.

5 réponses

Avatar
Xavier
Salut,

Regarde du côté de toHexString() :

new Integer(b).toHexString()

Xavier


"acc" a écrit dans le message de
news:41387751$0$326$
Bonjour,

j'aimerais savoir comment avoir l'équivalent en java de la fonction C
<printf("%x",...)>.
Car, Dans un petit programme je lis un fichier et dois afficher chaque
octet

en hexadécimal.

Ce que j'ai fais et qui n'a pas l'air de marcher et qui est de mettre les
données dans un tableau de byte puis de décomposer
chaque octet du tableau comme suis :

{
byte[] data=null;
char[] hexa = new char[16] ;

hexa[0] = '0'; hexa[1] = '1'; hexa[2] = '2'; hexa[3] = '3';
hexa[4] = '4'; hexa[5] = '5'; hexa[6] = '6'; hexa[7] = '7';
hexa[8] = '8'; hexa[9] = '9'; hexa[10] = 'a'; hexa[11] = 'b';
hexa[12] = 'c'; hexa[13] = 'd'; hexa[14] = 'e'; hexa[15] = 'f' ;

[..]
// Séléction, ouverture et lecture du fichier par
<RandomAccessFile.readFully(...)> qui place les données dans tableau de
byte

nomé <data>
[..]

// affichage des données du fichier
for(int i=0; i<data.length; i++) {
System.out.println( hexa[ data[i]>>4 ] + hexa[ data[i] & 0x0f ]) ;
// c'est la que c'est pas bon, pourqoi ????
}
}


Merci par avance de m'orienter.


Stéphane.




Avatar
YSMAL Vincent
Bonjour,
et un simple : System.out.println(Integer.toHexString(data[i]));
ne suffirait-il pas ?

"acc" a écrit dans le message de
news:41387751$0$326$
Bonjour,

j'aimerais savoir comment avoir l'équivalent en java de la fonction C
<printf("%x",...)>.
Car, Dans un petit programme je lis un fichier et dois afficher chaque
octet

en hexadécimal.

Ce que j'ai fais et qui n'a pas l'air de marcher et qui est de mettre les
données dans un tableau de byte puis de décomposer
chaque octet du tableau comme suis :

{
byte[] data=null;
char[] hexa = new char[16] ;

hexa[0] = '0'; hexa[1] = '1'; hexa[2] = '2'; hexa[3] = '3';
hexa[4] = '4'; hexa[5] = '5'; hexa[6] = '6'; hexa[7] = '7';
hexa[8] = '8'; hexa[9] = '9'; hexa[10] = 'a'; hexa[11] = 'b';
hexa[12] = 'c'; hexa[13] = 'd'; hexa[14] = 'e'; hexa[15] = 'f' ;

[..]
// Séléction, ouverture et lecture du fichier par
<RandomAccessFile.readFully(...)> qui place les données dans tableau de
byte

nomé <data>
[..]

// affichage des données du fichier
for(int i=0; i<data.length; i++) {
System.out.println( hexa[ data[i]>>4 ] + hexa[ data[i] & 0x0f ]) ;
// c'est la que c'est pas bon, pourqoi ????
}
}


Merci par avance de m'orienter.


Stéphane.




Avatar
jlp
acc wrote:
Bonjour,

j'aimerais savoir comment avoir l'équivalent en java de la fonction C
<printf("%x",...)>.
Car, Dans un petit programme je lis un fichier et dois afficher chaque octet
en hexadécimal.

Ce que j'ai fais et qui n'a pas l'air de marcher et qui est de mettre les
données dans un tableau de byte puis de décomposer
chaque octet du tableau comme suis :

{
byte[] data=null;
char[] hexa = new char[16] ;

hexa[0] = '0'; hexa[1] = '1'; hexa[2] = '2'; hexa[3] = '3';
hexa[4] = '4'; hexa[5] = '5'; hexa[6] = '6'; hexa[7] = '7';
hexa[8] = '8'; hexa[9] = '9'; hexa[10] = 'a'; hexa[11] = 'b';
hexa[12] = 'c'; hexa[13] = 'd'; hexa[14] = 'e'; hexa[15] = 'f' ;

[..]
// Séléction, ouverture et lecture du fichier par
<RandomAccessFile.readFully(...)> qui place les données dans tableau de byte
nomé <data>
[..]

// affichage des données du fichier
for(int i=0; i<data.length; i++) {
System.out.println( hexa[ data[i]>>4 ] + hexa[ data[i] & 0x0f ]) ;
// c'est la que c'est pas bon, pourqoi ????
}
}


Merci par avance de m'orienter.


Stéphane.


printf ajouté à la version 5 ( ex 1.5 ) de java en RC1 actuellement.


Avatar
azubi
Bonjour,

j'aimerais savoir comment avoir l'équivalent en java de la fonction C
<printf("%x",...)>.
Car, Dans un petit programme je lis un fichier et dois afficher chaque
octet en hexadécimal.

Ce que j'ai fais et qui n'a pas l'air de marcher et qui est de mettre les
données dans un tableau de byte puis de décomposer
chaque octet du tableau comme suis :

{
byte[] data=null;
char[] hexa = new char[16] ;

hexa[0] = '0'; hexa[1] = '1'; hexa[2] = '2'; hexa[3] = '3';
hexa[4] = '4'; hexa[5] = '5'; hexa[6] = '6'; hexa[7] = '7';
hexa[8] = '8'; hexa[9] = '9'; hexa[10] = 'a'; hexa[11] = 'b';
hexa[12] = 'c'; hexa[13] = 'd'; hexa[14] = 'e'; hexa[15] = 'f' ;


ben pour commencer on peut déclarer ce tableau en écrivant simplement

char[] hexa = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F'};


[..]
// Séléction, ouverture et lecture du fichier par
<RandomAccessFile.readFully(...)> qui place les données dans tableau de
byte nomé <data>
[..]

// affichage des données du fichier
for(int i=0; i<data.length; i++) {
System.out.println( hexa[ data[i]>>4 ] + hexa[ data[i] & 0x0f ]) ;
// c'est la que c'est pas bon, pourqoi ????
}
}


les réponses données par les autres lecteurs de ce forum sont sûrement plus
efficaces et plus intelligentes que la mienne... mais je voulais comprendre
pourquoi cet exemple ne fonctionnait pas...

en fait les bytes en Java sont signés, donc par exemple -3 >> 4 va donner
-1... allez donc savoir à quel caractère correspond hexa[-1] ?? Si on
désire vraiment persister dans la voie que vous avez emprunté, je suppose
qu'il devrait suffire d'écrire

System.out.println( hexa[Math.abs(data[i]>>4) ] + hexa[ data[i] & 0x0f ]) ;

bon ok, c'est pas vraiment propre, mais au moins c'est rigolo..

bonne soirée




Merci par avance de m'orienter.


Stéphane.


Avatar
Stéphane Delpech
Bonsoir,

"azubi" a écrit dans le message de
news:

ben pour commencer on peut déclarer ce tableau en écrivant simplement

char[] hexa = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F'};


Ok c'est moins lourd.


les réponses données par les autres lecteurs de ce forum sont sûrement
plus

efficaces et plus intelligentes que la mienne... mais je voulais
comprendre

pourquoi cet exemple ne fonctionnait pas...

en fait les bytes en Java sont signés, donc par exemple -3 >> 4 va donner
-1... allez donc savoir à quel caractère correspond hexa[-1] ?? Si on
désire vraiment persister dans la voie que vous avez emprunté, je suppose
qu'il devrait suffire d'écrire

System.out.println( hexa[Math.abs(data[i]>>4) ] + hexa[ data[i] & 0x0f ])
;


bon ok, c'est pas vraiment propre, mais au moins c'est rigolo..

bonne soirée


Non c'est pas moins intelligent que les autres, que je remercie au passage
pour leurs réponses, et comme tu le soulignes justement c'est une question
de signe.
J'ai pas essayé <Math.abs(...)> car j'ai lu dans un autre fil (gestion de
bytes, MSB, BCD) qu'il fallait masquer par 0xFF pour inhiber le signe et sa
marche à ceci près qu'il faut aussi intégrer une chaine vide comme ceci dans
le <.println(...+ "" +...)> sinon ça foire.

Merci.

Stéphane.