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 :

[Debutant] Conversion Hexa en Binaire


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [Debutant] Conversion Hexa en Binaire
    Bonjour,

    je suis ultra débutante en C, et je bloque sur un problème de conversion, voila : j'ai plusieurs variables en hexa du style "efcdab89" que je voudrais convertir en binaire (32 bits a stockés dans un int A[32] à l'aide d'une boucle for).
    J'ai essayé d'utiliser une fonction qui marche très bien pour transformer un caractère en 8 bits, je l'ai bidouillé un peu mais bien que cela me donne au final 32 bits ce ne sont pas les bons!!
    merci de votre aide, voici mon code :
    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
    int POW(int base, int power)
    {
         if (power)
         {
              int exp = base;
              while (--power > 0) exp *= base;
              return exp;
         }
         else return 1;
    }
     
    void ATOBLONG(int a,int* dest)
    {     
           int power = 0, rem = a, i;
           for (i = 0; i<32;i++)
           {
              power = POW(2,31-i);
              *dest = rem / power; dest++;
              rem %= power;
           }
    }
     
    int H0 = 0xefcdab89;
    int A[32];
     
        ATOBLONG(H0, A);
        for (j=0; j<32; j++)
        {
           printf("%i", A[j]);
         }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par radskin
    je suis ultra débutante en C, et je bloque sur un problème de conversion, voila : j'ai plusieurs variables en hexa du style "efcdab89" que je voudrais convertir en binaire (32 bits a stockés dans un int A[32] à l'aide d'une boucle for).
    Commence par une conversion numérique avec strtoul(). Ensuite, tu scannes la valeur bit par bit (<<, & etc.) et tu recopies chaque bit dans le tableau.

    C'est pas trop une question pour 'ultra-débutant(e)', mais il faut bien évoluer un jour...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir répondu,
    mais en débutante que je suis je n'arrive pas à la faire fonctionnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int H0 = 0x67452301;
    unsigned long A;
    errno = 0;
    A = strtoul(H0, NULL, 16);
    printf("%ld", A);
    et là mon programme plante, donc je n'arrive même pas à avoir ma valeur en décimal,
    je suis désolée, ça doit vraiment vous paraître ridicule come question
    merci pour votre aide.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par radskin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int H0 = 0x67452301;
    unsigned long A;
    errno = 0;
    A = strtoul(H0, NULL, 16);
    printf("%ld", A);
    Les variables de type entier contiennent des valeurs. Dire qu'elles sont binaires, décimales, octales ou hexadécimales a peu de sens en plus que de fixer l'intervalle des nombres représentables. Essaie d'imprimer H0 et tu auras directement le résultat auquel tu t'attends.

    Binaires, décimales, octales ou hexadécimales, ce sont des représentations des nombres qui peuvent être contenues dans des chaînes, servir lors de l'initialisation ou les E/S.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par radskin
    Merci d'avoir répondu,
    mais en débutante que je suis je n'arrive pas à la faire fonctionnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int H0 = 0x67452301;
    unsigned long A;
    errno = 0;
    A = strtoul(H0, NULL, 16);
    printf("%ld", A);
    et là mon programme plante, donc je n'arrive même pas à avoir ma valeur en décimal,
    je suis désolée, ça doit vraiment vous paraître ridicule come question
    merci pour votre aide.
    Tu as parlé d'une chaine de caractères (il y avait des " dans ta question initiale). C'est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char const *H0 = "0x67452301";
    unsigned long A;
    errno = 0;
    A = strtoul(H0, NULL, 16);
    printf("%lu", A);
    Dans A, il y a la valeur numérique (codée en binaire). Pour l'afficher en binaire, il faut tester chaque bit et afficher '0' ou '1' selon son état (sans se tromper de sens...)
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    et là mon programme plante, donc je n'arrive même pas à avoir ma valeur en décimal,
    C'est parce que le premier paramètre de la fonction stroul demande une chaine de caractères et non un entier.
    Cette fonction convertit une chaîne en un entier long non-signé.
    Un petit lien pour la route:
    http://www.linux-kheops.com/doc/man/...strtoul.3.html

    int main()
    {
    char chaine[] = "0x67452301";
    unsigned long A;

    A = strtoul(chaine, NULL, 16);
    printf("chaine hexa: %s entier non signe:%ld\n",chaine, A);

    system("pause");
    return 0;
    }
    Mais d'après cela:
    Je pense que le post de Jean-Marc va répondre complètement à ton besoin.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Voici un beau programme de démonstration :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
    unsigned long const leNombre = 0x67452301;
    char const *chaine1 = "0x67452301";
    char const *chaine2 = "67452301";
    unsigned long nbConverti1;
    unsigned long nbConverti15;
    unsigned long nbConverti2;
    unsigned long nbConverti25;
     
    nbConverti1 = strtoul(chaine1, NULL, 0);
    nbConverti15 = strtoul(chaine1, NULL, 16);
    nbConverti2 = strtoul(chaine2, NULL, 0); //Celui-la echouera.
    nbConverti25 = strtoul(chaine2, NULL, 16);
     
    printf("Nombre exprime en hexa en dur dans le source  : %10lu (0x%08lX)\n", leNombre, leNombre);
    printf("Nombre lu dans chaine avec prefixe, sans base : %10lu (0x%08lX)\n", nbConverti1, nbConverti1);
    printf("Nombre lu dans chaine avec prefixe, base 16   : %10lu (0x%08lX)\n", nbConverti15, nbConverti15);
    printf("Nombre lu dans chaine sans prefixe, sans base : %10lu (0x%08lX) (!)\n", nbConverti2, nbConverti2);
    printf("Nombre lu dans chaine sans prefixe, base 16   : %10lu (0x%08lX)\n", nbConverti25, nbConverti25);
     
    system("pause");
    return 0;
    }
    En sortie, il donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Nombre exprime en hexa en dur dans le source  : 1732584193 (0x67452301)
    Nombre lu dans chaine avec prefixe, sans base : 1732584193 (0x67452301)
    Nombre lu dans chaine avec prefixe, base 16   : 1732584193 (0x67452301)
    Nombre lu dans chaine sans prefixe, sans base :   67452301 (0x04053D8D) (!)
    Nombre lu dans chaine sans prefixe, base 16   : 1732584193 (0x67452301)
    pause: not found
    (oui, je l'ai testé sous FreeBSD)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [Conversion] Hexa -> binaire
    Par noOneIsInnocent dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2011, 11h00
  2. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  3. Conversion Hexa => binaire => décimal
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 6
    Dernier message: 10/04/2010, 13h53
  4. conversion hexa-binaire
    Par jack69 dans le forum C
    Réponses: 8
    Dernier message: 04/04/2005, 16h33
  5. [debutant] Conversion ASCII
    Par septox dans le forum Débuter
    Réponses: 1
    Dernier message: 28/02/2005, 09h45

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