Coonversion Héxa - Décimale [Résolu]

Signaler
Messages postés
10
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
12 juin 2008
-
Messages postés
10
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
12 juin 2008
-
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

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
#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++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
2
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!!!
Messages postés
10
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
12 juin 2008

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
Messages postés
10
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
12 juin 2008

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
Messages postés
10
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
12 juin 2008

En fait c'est bon j'ai tout capté. Merci bcp encore