Decimal <-> Hexadecimal - C++ - Programmation
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é
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
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
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 ?
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
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...
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...
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.
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 :
|
Code :
|
ensuite, va falloir m'expliquer le reste
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 :
|
Merci encore !
Marsh Posté le 23-10-2002 à 17:27:13
Code :
|
Pas testé, hein!
Edit: Un quartet = 4 bits
Marsh Posté le 23-10-2002 à 17:53:09
Toucouch a écrit a écrit :
|
Ca ne marche pas, mais l'idée doit y être...
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?
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 )
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...
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).
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
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 :
|
Code :
|
Testé et approuvé.
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 ?
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.
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 .
Pour des morceaux pas trop gros, ça devrait aller.
MP, mail, comme tu veux.
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...