Coonversion Héxa - Décimale

Résolu
2bhq Messages postés 10 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 juin 2008 - 15 mars 2007 à 14:43
2bhq Messages postés 10 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 juin 2008 - 15 mars 2007 à 16:42
Bonjour,

ne vous fiez pas au titre c'est pas si simple.
Je fais un programme qui accède au disque dur secteur par secteur et peut lire ou écrire ces derniers.
Je récupère des secteurs sour forme de tableaux de UCHAR.
Par exemple dans le secteur MBR j'ai la table des partions qui me donne le secteur de début et le nombre de secteurs de chaque partitions. Ces données sont en héxa. Par exemple l'adresse de la partition tiens sur 4 octets comme 20 D8 E0 30 chacun de ces octets est reçu dans une case de mon tableau donc sous forme d'un UCHAR. Le pb c'est que j'adresse mon disque en LBA et donc en décimal, je dois donc concatener ces 4 UCHAR -> 20D8E030 et transformer le nombre héxa ainsi obtenu en décimal -> 551084080.

Et c'est làque je coince. Avez vous des idées ? Je suis sous VC++ 6

6 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 mars 2007 à 14:59
#define TODWORD(a,b,c,d) (a<<24|b<<16|c<<8|d)

DWORD dword = TODWORD(0x20,0xD8,0xE0,0x30);

Ça c'est si ton tableau de UCHAR contien des valeurs hexa et non des valeurs ascii. Si il contien des valeurs ascii (c'est donc une chaine de caractère, le 0 de fin de chaine est présent), tu peux utiliser la fonction de BruNews dans les snippets ici.

Pour la conversion hexa vers int, ça n'a pas de sens. C'est la même chose. Un int peut très bien "faire passer" sa valeur pour de l'hexa et un DWORD pour un entier. Aucune conversion n'est nécessaire. Si tu veux récupérer la valeur en ascii (donc dans une chaine de caractère) et sous forme décimal, un simple itoa après l'utilisation de ma macro ou de la fonction de BruNews fera l'affaire.

C++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 mars 2007 à 15:43
Alors si ton tableau est codé comme suit par exemple:

tab[0] = 0x55;
tab[1] = 0x24;
etc...

Tout ce qu'il faut faire c'est d'assembler les 4 valeurs de 1 octet chacun pour en faire un DWORD 4 octets ce que je fais avec ma macro.
Si tu débute, je ne crois pas que tu comprendra quelque chose à décalement de bits et OR binaire et comme je suis extremement mauvais dans les explications (surtout pour les non-initiés), je laisse à ton prof (ou à un autre membre) le soin de t'expliquer tout ça en détail. Pour vulgariser, on peut faire comme suit:
0x20<<24 -> On tasse 0x20 à l'extreme gauche de notre DWORD
|0xD8<<16 -> On le fait suivre de 0xD8
|0xE0<<8 -> Lui même est suivit de 0xE0
|0x30 -> On insert la dernier valeur 0x30 à l'extreme droit du DWORD

On obtien donc: 0x20D8E030

Quand je dit que convertir un DWORD vers int n'a pas de sens c'est que l'on peut très bien faire:
int i = 0xFFDDEE00;
et
DWORD i = 2565235;

Un entier, de toute façon, sera transformé en hexa lors de la compilation, car c'est la même chose. Pour vulgariser un max, je dirais que la seule différence entre un nombre entier et un nombre hexa c'est que l'entier est compréhensible par l'homme et que l'hexa est compréhensible par la machine. Comme c'est la machine qui fait tout le travail, elle utilisera donc ce qu'elle comprend.

C++ (@++)<!--
3
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
15 mars 2007 à 15:02
Bon si j'ai bien compris il fo convertire un tableau de caracters en
decimal. Alors le plus simple c'est de parcourir le tableau à l'enver.


donc supposons que ton chiffre en hexa est dans tab[8] alors l'algo doit ressembler à ca


res = 0;

for(i = 0; i<8; i++)

    res = res * 10 + (tab[i] > '0' && tab[i] < '9') ? tab[i] - '0' : tab[i] - 'A'  + 10;

<hr size="2" width="100%" />Trafic web gratuit!!!
0
2bhq Messages postés 10 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 juin 2008
15 mars 2007 à 15:17
Merci bcp SAKingdom pour cette réponse. Mon tableau contient bien des valeurs héxa. Je ne suis pas expert en C++, je débute même, peux-tu m'en dire un peu plus sur l'utilisation de ce que tu me proposes.

Merci pour cette réactivité en tous cas
0

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

Posez votre question
2bhq Messages postés 10 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 juin 2008
15 mars 2007 à 16:01
Merci encore. En fait j'avais bien compris l'histoire de décalage, c'est plus la definition de la macro et son utilisation dans mon code que je ne vois pas trop.

Merci de ton aide
0
2bhq Messages postés 10 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 juin 2008
15 mars 2007 à 16:42
En fait c'est bon j'ai tout capté. Merci bcp encore
0
Rejoignez-nous