[ c++ ] pb de convertion hexa

Résolu
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005 - 14 mai 2005 à 14:24
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005 - 16 mai 2005 à 07:41
Bonjour a tous,

j'ai un petit soucis, je vous explique:

je dispose d'un text dans un buffer buf et je desire le metre dans un autre buffer buf2 mais en le transformant en hexa.

j'ai creer une fonction convHexa :

void convHexa ( car buf, int size )
{
buf2 = new char [size];
int i;
sprintf( buf2 ,"%02x, buf );
}

le probleme qui se pose c'est que buf2 contient seulement le code du premier caractere de buf.
J'ai aussi essayer:

void convHexa ( char buf, int size )
{
buf2 =new char [size];
int i;
for(i=0 ; i<size ; i++)
sprintf( buf2[i] ,"%02x, buf [i]);
}

mais la j'ai une erreure que je n'arrive pas a resoudre : subsript reqiere array or pointer type et sprintf can't convert a char to char*

Merci d'avance de votre aide.

18 réponses

cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
16 mai 2005 à 07:41
J'ai finalement reussit d'une autre maniere avec des pointeur et sprintf...
Merci a tous pour votre aide.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 14:40
Pour transformer de bianaire en Hexa, pas besoin de sprintf.

dans buf tu as un caractère, sur deux octets, tu as donc juste à faire

buf2[0] = (buf & 0xF);

if(buf2[0] > 9) buf2[0] += 'A' - 10; // lettre

else buf2[0] += '0'; // chiffre



buf2[1] = (buf & 0xF0) >> 1;


if(buf2[1] > 9) buf2[1] += 'A' - 10;

else buf2[1] += '0';
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 mai 2005 à 17:10
Et bé en faite ç'est normal aussi,
ce que tu passes en paramètre de ta fonction c'est un caractère : char buf
Heuresement qu'il ne t'en copie un, sinon C++, ben la honte hein
J'aurais été le dire à sa mere moi


void Aurevoir( void ); //Bonne journée
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 17:32
Oui mais un caractère est codé sur 1 octet, donc en hexa ca fait deux chiffre (ou lettres)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 mai 2005 à 18:26
Oki oki jprend la porte mdr


void Aurevoir( void ); //Bonne journée
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 18:47
Merci pour votre aide mais je ne comprend vraiment pas se que tu as fais vecchio56....
Peu me dire rapidement en francais ( algo )se que ca fais ?
Merci :)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 19:28
Comme je l'ai dit un carcactère fait 2 symboles en hexa (de 00h à FFh)



Le premier, tu le récupères avec le masque 0x0F. C'est un nombre entre
0 et 15, et toi tu veux quelque chose entre 0 et 9 ou A et B. Si c'est
entre 0 et 9, tu ajoutes juste '0' (pour obtenir le caractère
imprimable correspondant). Si c'est une lettre (entre 10 et 15), tu
enleve 10 (le nombre est entre 0 et 5) et tu ajoutes 'A' (caractère
entre 'A' et 'A'+5='F').

Pour le deuxième caractère c'est pareil, sauf que le masque est 0xF0.
Pour obtenir la bonne valeur, il faut décaler à droite, de 4 et pas de
1 comme je l'avais dit

J'ai aussi inversé poids fort et faible, ce qui donne finalement:



buf2[0] = (buf & 0xF0) >> 4;


if(buf2[0] > 9) buf2[0] += 'A' - 10;


else buf2[0] += '0';



buf2[1] = (buf & 0xF);

if(buf2[1] > 9) buf2[1] += 'A' - 10; // lettre

else buf2[1] += '0'; // chiffre



buf2[2] = 0;



Tu as conpris?
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 19:50
Oui j'a pigé merci ;)
par contre je trouve ca vraiment de devoir faire toute ces manip sur chaque "demi-octet"... es tu sur qu'il n'y a pas plus simple a base de sprintf....
car en faite j'ai reussit a faire cette convertion tres facilement en mode console....mais en passant mon code pour l'interface...les chose se complique.
Merci pour ton aide, si il n'y a pas d'autre solution je ferais avec la tienne ;)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 mai 2005 à 21:54
Oui, c'est plus simple avec sprintf mais aussi sprintf fera beaucoup
plus de boulot que nécessaire, a commencer par l'analyse de la chaine
que tu lui passe. J'aime autant voir ces lignes dans mon code plutot
qu'un sprintf

Mais j'ai testé, le premier code que tu as mis avec sprintf marche aussi
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
14 mai 2005 à 23:10
bin non c'est bien ca le pb le code que j'ai mis marche pas....il marche que pour 1 caractere...
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
14 mai 2005 à 23:41
void convHexa ( char buf , char** buf2 )

{

(*buf2) =new char [2];

sprintf( (*buf2) ,"%02x", buf );

}



int main(int argc, char *argv[])

{

char b = (char)123;



char * a;



convHexa( b , &a );



// a contient 7b



return 0;

}



tester et ça marche

Voili,Voilou
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 mai 2005 à 00:04
Pourquoi passer buf2 en char** si c'est pour faire une indirection systématique quand tu l'utilise? Il faut le passer en char*

Tu ne libères pas buf2, et buf2 doit contenir au moins 3 octets a cause
du zero terminal. Tu t'en sors la parce que plus de 2 octets doivent
être alloués
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
15 mai 2005 à 00:19
comme je l'alloue dans la fonction si je passe buf2 en char* il va y avoir des probleme.

Oui j'ai oublier de désallouer et tu as raison le zero de fin de chaine
peu poser probleme il faudrait allouer un tableau de 3 caractères.

Voili,Voilou
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
15 mai 2005 à 01:05
je ne comprend pas vos 2 codes lisent un seul octet au meme titre que le mien ....

buf2[0] = (buf & 0xF0) >> 4;
if(buf2[0] > 9) buf2[0] += 'A' - 10;
else buf2[0] += '0';

buf2[1] = (buf & 0xF);
if(buf2[1] > 9) buf2[1] += 'A' - 10; // lettre
else buf2[1] += '0'; // chiffre

buf2[2] = 0;

J'ai essayer de le metre dans une boucle mais sans succes...
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
15 mai 2005 à 11:38
Voila la boucle que j'ai fais avec le code de 19734 vecchio56 mais elle ne fonctionne pas car mes indice ne marche puisqu'il se recouvre...je n'arrive pas a resoudre ce pb.....
pouriez vous me donner un pti indice svp.

buf2 =new char [size];
int i;
for (i=0;i<size;i++)
{
buf2[i] = (buf[i] & 0xF0) >> 4;

if(buf2[i] > 9)
{
buf2[i] += 'A' - 10;
}
else
{
buf2[i] += '0';
}

buf2[i+1] = (buf[i] & 0x0F);

if(buf2[i+1] > 9)
{
buf2[i+1] += 'A' - 10; // lettre
}
else
{
buf2[i+1] += '0'; // chiffre
buf2[i+2] = ' ';
}

}

Merci d'avance.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 mai 2005 à 12:15
Non comme ca ca ne peut pas marcher, j'avais mal compris ce que tu
voulais faire. En fait tu veux convertir une chaine en décimal en une
chaine en hexa. La c'est un peu plus compliqué, tu peux utiliser atoi
et itoa:



char buf2[32], buf[] = "12345";

itoa(atoi(buf), buf2, 16);



Par contre il me semble que itoa n'est pas standart, il se peut que tu ne puisses pas l'utiliser avec ton compilateur
0
cs_devoX Messages postés 38 Date d'inscription mercredi 26 janvier 2005 Statut Membre Dernière intervention 16 mai 2005
15 mai 2005 à 14:08
Holala tous ca pour rien ( j'aurais jamais fini pour demain ).....pourtant ca avait l'aire de marcher mais ca ne me convertissait pas toutle contenu de buf...
Je dois juste metre ca a la place de mon ancien code de convertion ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 mai 2005 à 15:49
Oui, au debut ca marchait pas parce que buf était un char et non une chaine
0
Rejoignez-nous