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

MFC Discussion :

transformer un char en binaire


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut transformer un char en binaire
    Bonjour à tous,

    j'ai une variable c de type char, et je voudrais l'avoir dans sa forme binaire. Mon char c est de type hexa à la base, il appartient donc à l'intervalle [0..9][A..F]. Et je voudrais obtenir ça:
    0 -> 0000
    1 -> 0001
    ...
    9 -> 1001
    A -> 1010
    etc...
    je l'ai fait à la main avec un switch, mais ce serait plus élégant s'il existait une façon plus propre de faire ça.

    Merci.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour les manipulations de bits et les conversions binaires, tu peux utiliser std::bitset (voir la FAQ C++).

    Par contre, quand tu dis que ton char contient A (par exemple), il s'agit de 'A' ou bien de 0xA ?

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    il a'agit bien du char 'A', et pas 0xA ni 0x41 (valeur ascii pour A). C'est ça le problème
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans ce cas le switch me paraît la meilleure solution. Ce sera la plus simple et la plus performante je pense.

  5. #5
    mat.M
    Invité(e)
    Par défaut
    On peut utiliser une table de hashage ; il ya CMap pour les MFC , un équivalent doit exister avec la STL ( std::hash ? )
    Sinon si c'est plus complexe on peut utiliser un arbre binaire

  6. #6
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    regarde ce lien :

    http://c.developpez.com/faq/vc/?page...tringHexaToInt
    ça marche de la base 2 à 36 et inversement et ç utilise strtol et _itoa

    et plus largement :

    http://c.developpez.com/faq/vc/?page=Conversions
    Qui va piano va sano...

  7. #7
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    pour convertir les "valeurs numériques hexa" de 0 à 9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char c;
    // mise à jour du c
    // test de validité de c
     
    int ValeurNumérique= c-'0';
    '0' vaudra 0 soit 0000
    '1' vaudra 1 soit 0001
    ...
    '9' vaudra 9 soit 1001


    pour convertir les "valeurs non numérique hexa" en supposant qu'il n'y ait que des majuscules soit de A à F

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    char c;
    // mise à jour du c
    // test de validité de c
     
    int ValeurNumérique= c-'A' + 10 ;
    'A' vaudra 10 soit 1010
    ...
    'F' vaudra 15 soit 1111

    tu ecris ces 2 fonctions
    tu fais une boucle pour parcourir ta chaine
    tu fais les tests qu'il faut pour appeller la bonne fonction

    pas besoins de swtich case à 15 branches, 2 if suffisent
    il y a du linge sur la corde à linge

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Cette méthode n'est pas portable, elle dépend de l'encodage de caractères utilisé (les chiffres / lettres ne sont pas toujours consécutifs).

    De toute façon c'est une représentation binaire qui est demandée, pas une conversion char -> int.

    Concernant les fonctions de conversion, pour une chaîne ok, mais je trouve que c'est sortir l'artillerie lourde pour simplement convertir un caractère ne pouvant prendre que 15 valeurs.

  9. #9
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    ok pour la "non consecutivité" et encore, j'ai des doutes sur le fait que le 0 ne precede pas tout le temps le 1 quelques soit la table

    sinon pour la conversion si j'ai bien compris, il veut que le '5' (char) corresponde au 1001 binaire qui n'est rien d'autre que la MEME representation du 5 entier.

    apres si il voulait une chaine "1001" alors ok, j'avais mal compris
    il y a du linge sur la corde à linge

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Salut à tous,

    désolé, j'étais en congès
    pour être le plus clair possible, voici la fonction que j'ai fait (qui marche et qui fait exactement ce que je veux):
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    void GetBinaryForm(char c, BOOL &b0, BOOL &b1, BOOL &b2, BOOL &b3)
    {
    	switch (c)
    	{
    	case '0':
    		b3=0;
    		b2=0;
    		b1=0;
    		b0=0;
    		break;
    	case '1':
    		b3=0;
    		b2=0;
    		b1=0;
    		b0=1;
    		break;
    	case '2':
    		b3=0;
    		b2=0;
    		b1=1;
    		b0=0;
    		break;
    	case '3':
    		b3=0;
    		b2=0;
    		b1=1;
    		b0=1;
    		break;
    	case '4':
    		b3=0;
    		b2=1;
    		b1=0;
    		b0=0;
    		break;
    	case '5':
    		b3=0;
    		b2=1;
    		b1=0;
    		b0=1;
    		break;
    	case '6':
    		b3=0;
    		b2=1;
    		b1=1;
    		b0=0;
    		break;
    	case '7':
    		b3=0;
    		b2=1;
    		b1=1;
    		b0=1;
    		break;
    	case '8':
    		b3=1;
    		b2=0;
    		b1=0;
    		b0=0;
    		break;
    	case '9':
    		b3=1;
    		b2=0;
    		b1=0;
    		b0=1;
    		break;
    	case 'A':
    		b3=1;
    		b2=0;
    		b1=1;
    		b0=0;
    		break;
    	case 'B':
    		b3=1;
    		b2=0;
    		b1=1;
    		b0=1;
    		break;
    	case 'C':
    		b3=1;
    		b2=1;
    		b1=0;
    		b0=0;
    		break;
    	case 'D':
    		b3=1;
    		b2=1;
    		b1=0;
    		b0=1;
    		break;
    	case 'E':
    		b3=1;
    		b2=1;
    		b1=1;
    		b0=0;
    		break;
    	case 'F':
    		b3=1;
    		b2=1;
    		b1=1;
    		b0=1;
    		break;
    	}
    }
    Mais je trouve ça trop moche!!
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En EBCDIC, ce sont les lettres qui ne sont pas consécutives, pas les chiffres, et on a de la chance car pour A -> F ça se suit.
    Voir ici
    On peut donc éventuellement faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       int val = (c>= 'A') ? c-'A'+ 10: c- '0';
     
       int b0, b1, b2, b3;
       b0 = val & 1;
      b1 = (val & 2) ? 1 : 0;
      b2 = (val & 4) ? 1 : 0;
      b3 = (val & 8) ? 1 : 0;
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    ok thanks
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. Transformation en un arbre binaire
    Par lylia SI dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/09/2006, 19h03
  2. vc++ express 2005 comment transformé les char * en String
    Par ben_ghost dans le forum Visual C++
    Réponses: 1
    Dernier message: 20/07/2006, 06h52
  3. transformer un char en int
    Par transistor49 dans le forum C
    Réponses: 7
    Dernier message: 13/12/2005, 21h47
  4. [XML][XSLT] transformer le xml en binaire via une xslt
    Par chama dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/07/2005, 11h42
  5. Réponses: 5
    Dernier message: 29/04/2005, 15h15

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