Decimal <-> Hexadecimal

Decimal <-> Hexadecimal - C++ - Programmation

Marsh Posté le 23-10-2002 à 15:09:51    

A part passer par un sprintf() puis un atoi(), quelqu'un a-il une idée (mathématique)de comment convertir une valeur hexa-decimal (long) en son "image" décimal (long) ?
 
example :
 
hexa: 03 50 00 00
decimal: 3500000
 
J'en ai besoin pour ce soir, mais j'ai trop de boulot pour y réfléchir cet après midi...

Reply

Marsh Posté le 23-10-2002 à 15:09:51   

Reply

Marsh Posté le 23-10-2002 à 15:12:42    

heu... j'ai pas tout compri.
 
Pour moi 03 50 00 00 (hex) = 55574528 (dec).
 
Me dire si je me suis planté

Reply

Marsh Posté le 23-10-2002 à 15:13:22    

tu parcours les chiffres de droite à gauche (indice i) et tu appliques lq formule:
resultat = 0;
 
boucle while/for
   Resultat = resultat + 16^i*chiffre;
 
Voilà, tu as l'idée!
 
3500000h = 55574528, c'était bien ça ;)


Message édité par ITM le 23-10-2002 à 15:14:25

---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 23-10-2002 à 15:15:16    

tu lis de droite à gauche ton paquet hexadécimal. Tu fais un boucle pour ça qui multiplie chaque caractère par 16^i. Ou i vaut 0 pour le chiffrel plus à droite, 1 pour le suivant, et à chaque fois tu additionne le résultat  
.ect... Bein sur avant tu convertis les valeurs alphabétiques par leur valeur numérique....
EX:
1F
Tu lis le f, tu le convertis en 15(un beau case swtich)tu multiplies 15 par 16^0, ensuite tu passe au 1, tu le multiplies par 16^1...t'additiones et ça te donne 31. Au passage ton exemple est totalement foireux ou j'ai rien compris à l'hexa moi :?
Je suis vraiment trop lent et pas clair :p


Message édité par belgique le 23-10-2002 à 15:15:54

---------------
Belgian connection
Reply

Marsh Posté le 23-10-2002 à 15:30:32    

je lis en memoire des long et je veut convertir ces valeur de façon a "voir" en decimal la meme chose qu'en hexa.
 
si j'ai 00350000 (hexa)
je veux comme résultat 88B8 (hexa)
car 88B8 = 35000 en decimal !
 
C'est plus clair ?

Reply

Marsh Posté le 23-10-2002 à 15:32:32    

Erreur de ma part !
 
Si j'ai 00 35 00 00
Je veux 00 05 57 30 qui est lui egal a 350000 en decimal

Reply

Marsh Posté le 23-10-2002 à 15:36:08    

TotOOntHeMooN a écrit a écrit :

Erreur de ma part !
 
Si j'ai 00 35 00 00
Je veux 00 05 57 30 qui est lui egal a 350000 en decimal




 
Bon, je comprends tjrs pas.
 
En gros, tu veux un convertisseur hex2dec ou dec2hex ? ou je c pas moi, tu me parle de long, hors dans un long tu peux pas avoir d'hexa, dans une string au mieux. Enfin, j'ai un peu de mal...

Reply

Marsh Posté le 23-10-2002 à 15:43:07    

nykouze a écrit a écrit :

 
 
Bon, je comprends tjrs pas.
 
En gros, tu veux un convertisseur hex2dec ou dec2hex ? ou je c pas moi, tu me parle de long, hors dans un long tu peux pas avoir d'hexa, dans une string au mieux. Enfin, j'ai un peu de mal...




 
Je te remerci de percister pour mon problème !
 
un long = 4 octets et se representation est celle que tu souhaites...
 
Je lis donc en memoire des blocs de 4 octets qui représentes des hiscores de jeux.
Le problème est le suivant : Si une personne a fait 350000 points dans le jeux, sa valeur est enregistrée en mémoire dans un bloc de 4 octets mais elle est convertie avant en 3473408 !
et si tu fais une bête conversion de cette valeur décimale en hexa tu trouves 35 00 00 !  
Les programmeurs du jeux se sont amusés a faire une routine pour convertir la valeur pour que visuellement parlant l'hexa soit "égal" a la valeur décimal de départ... Mois je souhaite faire l'inverse...

Reply

Marsh Posté le 23-10-2002 à 16:05:11    

En gros je veux faire ça...
 
long visual_hex2dec(long hex)
{
  char buf[9];
 
  sprintf(&buf, "%08X\n", hex);
  return (atoi(buf));
}
 
... sans passer par une chaine.  

Reply

Marsh Posté le 23-10-2002 à 16:42:31    

TotOOntHeMooN a écrit a écrit :

En gros je veux faire ça...
 
long visual_hex2dec(long hex)
{
  char buf[9];
 
  sprintf(&buf, "%08X\n", hex);
  return (atoi(buf));
}
 
... sans passer par une chaine.  
 




hmmm, ce que je pige pas, c si tu lis 4 octets en memoire, la conversion sera faite toute seule.... enfin, a mon avis, les codeurs du jeu ont directement ecrits en memoire les 4 octets du long.
 
enfin, en gros j'ai pigé ca:

Code :
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. int main()
  5. {
  6.   int   src;
  7.   long  test;
  8.   long  res; 
  9.   test = 350000;
  10.   res = 0;
  11.   src = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  12.   write(src, &test, sizeof(long));
  13.   close(src);
  14.   src = open("test.txt", O_RDONLY);
  15.   read(src, &res, sizeof(long));
  16.   close(src); //edit: j'oubliais ca... :)
  17.   printf("mon test: %d", res);
  18.   return 0;
  19. }


Code :
  1. [16:19:30]
  2. [~/temp]
  3. [nykouze@gwyneth]$ gcc test.c
  4. [16:19:34]
  5. [~/temp]
  6. [nykouze@gwyneth]$ ./a.out
  7. mon test: 350000


 
ensuite, va falloir m'expliquer le reste :)


Message édité par nykouze le 23-10-2002 à 16:46:11
Reply

Marsh Posté le 23-10-2002 à 16:42:31   

Reply

Marsh Posté le 23-10-2002 à 17:13:23    

Je ne dois pas arriver a me faire comprendre...
 
Je sais bien qu'une conversion hexa<->decimal se faittoute seule puisque se sont les mêmes valeurs mais représentés de façon différente...
 
Prenons un plus petit example :
 
si j'ai 0x20, on est d'accord que ça fait 32
a l'inverse, si l'on a 32 cela fait 0x20
c'est ok, c'est une conversion hexa<->decimal toute conne...
 
Maintenant ce que je veux c'est une fonction qui ferait ça :
 
si j'ai 0x20, la fonction retourne 20
si j'ai 0x1000, la fonction retourne 1000
et si j'ai 0x00350000, la fonction retourne 350000
 
au pire j'utiliserais ce bout de code qui fonctionne très bien :

Code :
  1. main ()
  2. {
  3.   char *buf[9]; // 8 + 1
  4.   long hex = 0x00350000;  // valeur de depart
  5.   long dec = 0;
  6.   // conversion en passant par une chaine...
  7.   // (ce que je voudrais eviter)
  8.   sprintf(buf, "%08X", hex);
  9.   dec = atoi(buf);
  10.   // affiche la valeur desiree
  11.   printf ("%d\n", dec); 
  12. }


 
Merci encore !

Reply

Marsh Posté le 23-10-2002 à 17:27:13    

Code :
  1. int resultat = 0;
  2. for(int i=28;i>=0;i-=4)
  3. {
  4.   int tmp = (valeur & 0xF0000000) >> i;
  5.   resultat = resultat * 10 + tmp;
  6.   valeur <<= 4;
  7. }


Pas testé, hein!
 
Edit: Un quartet = 4 bits :D


Message édité par Toucouch le 23-10-2002 à 17:28:44
Reply

Marsh Posté le 23-10-2002 à 17:53:09    

Toucouch a écrit a écrit :

Code :
  1. int resultat = 0;
  2. for(int i=28;i>=0;i-=4)
  3. {
  4.   int tmp = (valeur & 0xF0000000) >> i;
  5.   resultat = resultat * 10 + tmp;
  6.   valeur <<= 4;
  7. }


Pas testé, hein!
 
Edit: Un quartet = 4 bits :D




 
Ca ne marche pas, mais l'idée doit y être...

Reply

Marsh Posté le 23-10-2002 à 17:56:09    

TotOOntHeMooN a écrit a écrit :

 
 
Ca ne marche pas, mais l'idée doit y être...



Et en passant tout en unsigned long?

Reply

Marsh Posté le 23-10-2002 à 18:32:08    

Toucouch a écrit a écrit :

Et en passant tout en unsigned long?




 
Normalement ça ne doit rien changer... D'ailleur ça ne change rien :o)

Reply

Marsh Posté le 23-10-2002 à 18:33:15    

C'est quoi ce smilley de m... qui c'est mis a la fin de mon texte sons que je le souhaite ! :)
La je le voulais...

Reply

Marsh Posté le 23-10-2002 à 20:26:50    

Y a un truc que je ne comprends pas. L'exemple est trompeur ?
En octal, ça peut fonctionner, mais en hexa, on a A, B, C, D, E, F. Comment le %d va-t-il comprendre A0BF ?
 
J'ai sans doute mal compris le but cherché (disouli).

Reply

Marsh Posté le 23-10-2002 à 21:48:20    


Maintenant ce que je veux c'est une fonction qui ferait ça :
 
si j'ai 0x20, la fonction retourne 20
si j'ai 0x1000, la fonction retourne 1000
et si j'ai 0x00350000, la fonction retourne 350000
BREF : Inutile de nous dire que c'est de l'hexa.... Je vois pas ou il est ... c vraiment tout con alors... tu pars de la gauche tu lis à partir  pas de x et du fait somme=somme*10+chiffre


---------------
Belgian connection
Reply

Marsh Posté le 24-10-2002 à 03:41:10    

C'est pas de l'hexadécimal, c'est du décimal codé binaire (dcb).
C'est (était ?) utilisé dans le jeux vidéos parce qu'il n'y a pas besoin de reconvertir en base 10 (opération "lourde" ) pour l'afficher.

Code :
  1. //arithmétique (plus sûr)
  2. unsigned long dcb2vala(unsigned long dcb){
  3. unsigned long val= 0, weight= 1;
  4. do{
  5.  val+= weight*(dcb%16); //ou &0xF
  6.  weight*= 10;
  7.  dcb/= 16; //ou >>4
  8. }while(dcb!=0);
  9. return val;
  10. }
Code :
  1. #include <limits.h>
  2. //binaire (plus rapide ?)
  3. unsigned long dcb2valb(unsigned long dcb){
  4. unsigned long val= 0;
  5. int shift= sizeof(unsigned long)*CHAR_BIT - 4;
  6. do{
  7.  val+= (dcb>>shift)&0xF;
  8.  val*= 10;
  9. }while((shift-=4) != 0);
  10. return val;
  11. }

Testé et approuvé.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 24-10-2002 à 11:40:36    

Ouf ! Merci, enfin quelqu'un qui m'a compris...
Comme tu l'as deviné, c'est pour utiliser avec des vieux jeux ;o)
 
En fait, je suis entrain de faire un frontend pour ma borne d'arcade sous mame et je souhaite afficher les hi-scores des  jeux en plus des infos "habituelles" (nom, année, fabriquant, hardware, ...) Ce qui a ma conaissance n'a pas encore été fait !
Pour cela j'utilise les dumps mémoire ".hi" généré par l'émulateur et pour chaque jeux je vais chercher les infos à l'endroit voulu.
 
Merci de ton aide !
 
ps: si le projet t'intéresse ?

Reply

Marsh Posté le 24-10-2002 à 11:48:30    

carbon_14 a écrit a écrit :

Y a un truc que je ne comprends pas. L'exemple est trompeur ?
En octal, ça peut fonctionner, mais en hexa, on a A, B, C, D, E, F. Comment le %d va-t-il comprendre A0BF ?
 
J'ai sans doute mal compris le but cherché (disouli).




 
Dans mon cas, les caractères hexa (A-F) ne seront jamais utilisés puisque la valeur hexa "se lit comme" du décinal.
 
Merci pour ta participation ainsi qu'à tous les autres.

Reply

Marsh Posté le 25-10-2002 à 05:05:58    

A noter que si la performance de la fonction était critique, il vaudrait mieux générer directement du texte.
 

TotOOntHeMooN a écrit a écrit :

ps: si le projet t'intéresse ?


Eh bien... oui !
J'ai plus le temps de jouer, mais participer autour des jeux...
 
Je n'ai jamais fait de projet complet. Les deux projets (en binôme) de ma formation, je les ai magnifiquement foirés en voulant trop/mieux faire :D .
Pour des morceaux pas trop gros, ça devrait aller.
 
MP, mail, comme tu veux.


Message édité par Musaran le 25-10-2002 à 05:06:38

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed