IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Conversion héxadecimal -> decimal


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut Conversion héxadecimal -> decimal
    Bonjour,

    Voila j'ai un nombre en héxa sur 4 octets et stocké dans un tableau de char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fread(adresse,1,4,file);     //adresse[4] contient "03 00 00 C8"
    c1[0] = adresse[0];         // c1[0] contient "03"
    c2[0] = adresse[1];         // c2[0] contient "00"
    c3[0] = adresse[2];         // c3[0] contient "00"
    c4[0] = adresse[3];         // c4[0] contient "C8"
    adresseEnreg = (c2[0])*256*256*256 + (c1[0])*256*256 + 
                                     (c4[0])*256 + c3[0];
    Avec le debuger, je me suis aperçu que (c1[0])*256*256 contient 196608 (0x00030000),
    (c4[0])*256 contient 51200 (0x0000C800) jusque là tout est normal,mais ensuite je me suis aperçu que adresseEnreg contient 182272 (0x0002C800) alors qu'il devrait contenir 247808 (0x0003C800)...

    si qq'un voit l'erreur...

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Quel est le type utilisé pour adresseEnreg ?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    type long

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Essaie en unsigned long.

    Lorsque tu mets c[i] = ... , tu l'affiche réellement ou c'est une supposition ?

    Et si tu ajoutes seulement les non nuls (C[1] et C[4])

  5. #5
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par cout
    Bonjour,

    Voila j'ai un nombre en héxa sur 4 octets et stocké dans un tableau de char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fread(adresse,1,4,file);     //adresse[4] contient "03 00 00 C8"
    c1[0] = adresse[0];         // c1[0] contient "03"
    c2[0] = adresse[1];         // c2[0] contient "00"
    c3[0] = adresse[2];         // c3[0] contient "00"
    c4[0] = adresse[3];         // c4[0] contient "C8"
    adresseEnreg = (c2[0])*256*256*256 + (c1[0])*256*256 + 
                                     (c4[0])*256 + c3[0];
    Avec le debuger, je me suis aperçu que (c1[0])*256*256 contient 196608 (0x00030000),
    (c4[0])*256 contient 51200 (0x0000C800) jusque là tout est normal,mais ensuite je me suis aperçu que adresseEnreg contient 182272 (0x0002C800) alors qu'il devrait contenir 247808 (0x0003C800)...

    si qq'un voit l'erreur...
    Quel est le rapport avec la conversion hexadécimal -> décimal ?

    Pour résumer, ici tu assumes un passage de la base 256 à la base 10, est-ce vraiment ce que tu veux (en faisant en plus joujou avec l'endianess...) ?

    Pour un passage hexadecimal -> decimal c'est LSB*16^0 + (LSB+1)*16^1 + ... + MSB*16^N où N est (le nombre de bytes à traiter -1)

    A+

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Essaie en unsigned long
    ça n'a rien changé

    Et si tu ajoutes seulement les non nuls (C[1] et C[4])
    ça n'a rien changé non plus

    Lorsque tu mets c[i] = ... , tu l'affiche réellement ou c'est une supposition ?
    j'ai pas trop compris ce que tu voulais dire là

  7. #7
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    j'ai pas trop compris ce que tu voulais dire là
    Et bien lorsque tu dis, c1[0] vaut 03, est ce que tu en es sur ou c'est ce que tu voudrais ?

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Quel est le rapport avec la conversion hexadécimal -> décimal
    Le resultat de l'addiction est sensé etre en décimal

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Mon debugger m'indique que le contenu de c1[0] est égal à 3 (0x03),

    et lorsque je lui demande le contenu de "(c1[0])*256*256" il m'indique
    "196608 (0x00030000)" et "(c4[0])*256" il m'indique "51200 (0x0000C800)"

    C'est vraiment bizarre... c'est au moment de l'addition que le resultat est modifié : 0x0002C800 au lieu de 0x0003C800

  10. #10
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Re,

    Citation Envoyé par cout
    Mon debugger m'indique que le contenu de c1[0] est égal à 3 (0x03),

    et lorsque je lui demande le contenu de "(c1[0])*256*256" il m'indique
    "196608 (0x00030000)"

    C'est vraiment bizarre... c'est au moment de l'addition que le resultat est modifié : 0x0002C800 au lieu de 0x0003C800

    Si c1, c2, c3 et c4 sont des char et que char est considéré comme étant signé, c'est normal, il faut en faire des unsigned char (et le resultat à mettre en unsigned long aussi).
    0xC8 , ça donne 200 ou -56 ...

    Démo:
    3*256*256 (from c1) - 56*256 (from c8) = 182272

    A+

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le plus simple serait certainement de mettre tes quatre caracteres dans une chaine valide (i.e. terminee par un '\0') et d'utiliser strtol() en precisant la base 16.

    EDIT: Reponse sans rapport avec la question originale - a ignorer.

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Ben merci beaucoup Foobar1329, le problème venait de là... c'est parfait

  13. #13
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par DaZumba
    Le plus simple serait certainement de mettre tes quatre caracteres dans une chaine valide (i.e. terminee par un '\0') et d'utiliser strtol() en precisant la base 16.
    L'idée est bonne mais...Ce n'est pas une conversion héxadécimale -> décimale que fait cout, c.a.d que le motif original même si il s'agit de cracatères hexadécimaux, ne représentent pas un nombre en base 16 !

    A+

  14. #14
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Foobar1329
    L'idée est bonne mais...Ce n'est pas une conversion héxadécimale -> décimale que fait cout, c.a.d que le motif original même si il s'agit de cracatères hexadécimaux, ne représentent pas un nombre en base 16 !
    Bien vu, j'ai mal compris la question. Ceci dit, je ne comprend toujours pas ce que cout veut faire. En interne, la base de representation d'un nombre importe peu. Elle n'a d'importance que lors des operations d'I/O.

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cout
    Bonjour,

    Voila j'ai un nombre en héxa sur 4 octets et stocké dans un tableau de char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fread(adresse,1,4,file);     //adresse[4] contient "03 00 00 C8"
    c1[0] = adresse[0];         // c1[0] contient "03"
    c2[0] = adresse[1];         // c2[0] contient "00"
    c3[0] = adresse[2];         // c3[0] contient "00"
    c4[0] = adresse[3];         // c4[0] contient "C8"
    adresseEnreg = (c2[0])*256*256*256 + (c1[0])*256*256 + 
                                     (c4[0])*256 + c3[0];
    Avec le debuger, je me suis aperçu que (c1[0])*256*256 contient 196608 (0x00030000),
    (c4[0])*256 contient 51200 (0x0000C800) jusque là tout est normal,mais ensuite je me suis aperçu que adresseEnreg contient 182272 (0x0002C800) alors qu'il devrait contenir 247808 (0x0003C800)...

    si qq'un voit l'erreur...
    Peut être qu'en soignant un peu la présentation, on arriverait à écrire du code moins buggé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
     
    int main (void)
    {
       unsigned char adresse[4] =
          {
             0x03, 0x00, 0x00, 0xC8
          };
       unsigned c1 = adresse[0];         // c1[0] contient "03"
       unsigned c2 = adresse[1];         // c2[0] contient "00"
       unsigned c3 = adresse[2];         // c3[0] contient "00"
       unsigned c4 = adresse[3];         // c4[0] contient "C8"
     
    #if 0
     
       unsigned long adresseEnreg = c2 * 256 * 256 * 256
                                    + c1 * 256 * 256
                                    + c4 * 256
                                    + c3;
    #else
     
       unsigned long adresseEnreg = c1 * 256 * 256 * 256
                                    + c2 * 256 * 256
                                    + c3 * 256
                                    + c4;
    #endif
     
       printf ("c1 = %02X\n", c1);
       printf ("c2 = %02X\n", c2);
       printf ("c3 = %02X\n", c3);
       printf ("c4 = %02X\n", c4);
     
       printf ("adresseEnreg = %08lX\n", adresseEnreg);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    c1 = 03
    c2 = 00
    c3 = 00
    c4 = C8
    adresseEnreg = 030000C8
     
    Press ENTER to continue.

  16. #16
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ben non. Ce ne sont pas de bouts de chaines, mais des valeurs numériques...
    Oui, je n'avais pas compris la question. J'edite mon post pour preciser que cette reponse est a cote de la plaque...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion heure en decimal
    Par Goldorak2 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/08/2007, 17h34
  2. conversion sexadecimaux vers decimal
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 05/02/2007, 12h17
  3. conversion chaine string, decimal,integer
    Par gsmdu62 dans le forum Delphi
    Réponses: 10
    Dernier message: 19/06/2006, 22h40
  4. Conversion chaine en decimal
    Par siddh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/02/2006, 17h50
  5. conversion nombre binaire -> decimal
    Par spoun95 dans le forum Langage
    Réponses: 7
    Dernier message: 25/11/2005, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo