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 hexa-binaire


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut conversion hexa-binaire
    Bonjour,

    Je voudrais transformer la chaîne source "FA3" en une chaîne "111110100011".

    Je pensais passer par un enum suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum convert { "0000", "0001", 0010", .....}
    Je voulais ensuite scruter chaque caractere de ma source, faire un strtod ou equivalent puis remplir la chaine destination avec l'enum correspondant.

    Mon souci est existe-til une fonction de conversion me renvoyant 15 pour 'F' (ou tout simplement comment utiliser strtod correctement peut-etre) ?

    Merci

  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 Re: conversion hexa-binaire
    Citation Envoyé par jack69
    Mon souci est existe-til une fonction de conversion me renvoyant 15 pour 'F' (ou tout simplement comment utiliser strtod correctement peut-etre) ?
    Déjà, ça machera mieux avec la bonne fonction! Montre comment tu utilises strtoul().
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 747
    Points
    747
    Par défaut Re: conversion hexa-binaire
    Citation Envoyé par jack69
    Mon souci est existe-til une fonction de conversion me renvoyant 15 pour 'F'
    Oui, la fonction moins:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int val(char x){
        if &#40;x>='0'  && x<='9'&#41; 
            return x - '0';
        if &#40;x>='A' && x<'F'&#41; 
            return x - 'A' + 10;
    Sinon pour strtod, il te faut rajouter "0x" devant ta valeur (pour lui indiquer que c'est de l'hexa). Ou tu peux utiliser strtol en indiquant la base (16 pour hexa).

  4. #4
    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 Re: conversion hexa-binaire
    Citation Envoyé par D[r
    eadLock]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int val&#40;char x&#41;&#123;
        if &#40;x>='0'  && x<='9'&#41; 
            return x - '0';
        if &#40;x>='A' && x<'F'&#41; 
            return x - 'A' + 10;
    Pour A-F (et les minuscules ?), ce n'est pas garanti par le langage. Ca fonctionne en ASCII.
    Sinon pour strtod, il te faut rajouter "0x" devant ta valeur (pour lui indiquer que c'est de l'hexa). Ou tu peux utiliser strtol en indiquant la base (16 pour hexa).
    strtod() n'accepte que des chaines décimales avec ou sans virgule fixe. strtoul() accepte les chaines hexa avec la base 16 ou les chaines 0x<hexa> avec la base 'automatique' (0).
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut Re: conversion hexa-binaire
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par jack69
    Mon souci est existe-til une fonction de conversion me renvoyant 15 pour 'F' (ou tout simplement comment utiliser strtod correctement peut-etre) ?
    Déjà, ça machera mieux avec la bonne fonction! Montre comment tu utilises strtoul().
    Effectivement, ca marche beaucoup mieux avec strtoul ! Merci bien.

    Une petite question supplémentaire pour info cependant avant de clore le post : mon code est le suivant :
    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
    int main&#40;void&#41;
    &#123;
       char* source = "0123456789ABCDEF";
       char*dest=NULL;
       char courant;
       char* bincode=NULL;
       int i,j,srclen=0, destlen=0;
       unsigned long index;
     
       srclen = strlen&#40;source&#41;;
       destlen = 4* srclen;
     
       dest = &#40;char*&#41;malloc&#40;destlen&#41;;
     
       if &#40;dest != NULL&#41;
       &#123;
          for&#40;i=0; i<srclen;i++&#41;
          &#123;
             courant = *source;
             printf&#40;"courant &#58; %c\n", courant&#41;;
     
             index = strtoul&#40;&courant, stop, 16&#41;;
             printf&#40;"index &#58; %d\n", index&#41;;
     
             bincode = tab&#91;index&#93;;
             printf&#40;"bincode &#58; %.4s\n", bincode&#41;;
     
             if &#40; index >= 0 &#41;
             for&#40;j=0; j<4; j++&#41;
                  *dest++ = *bincode++;
     
             source++;
          &#125;
       &#125;
       else
       &#123;
           printf&#40;"Malloc Dest echoue !!!!\n"&#41;;
           return -1;
       &#125;
     
       *dest = '\0';
       dest = dest-destlen;
       printf&#40;" destination &#58; %s\n", dest&#41;;
     
       return 0;
    &#125;
    Suis-je obligé de passer par la variable intermédiaire courant ou existe-t-il une autre fonction qui me permettrait de travailler sur source sans considérer que le nombre est "0123456..." comme le fait strtoul ?

  6. #6
    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 Re: conversion hexa-binaire
    Citation Envoyé par jack69
    Une petite question supplémentaire pour info cependant avant de clore le post : mon code est le suivant :
    Ce code est incomplet
    Suis-je obligé de passer par la variable intermédiaire courant ou
    Oui. Par contre, la valeur numérique est déjà en binaire. Il suffit donc de tester chaque bit de la valeur et de le convertir en '0' ou '1'. Ca doit pas être trop dur...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut
    Ce code est incomplet
    J'ai oublié la déclaration de tab que j'avais réalisé en" globale" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* tab&#91;16&#93; = &#123; "0000", "0001", "0010", "0011",
    				  "0100", "0101", "0110", "0111", 
    				  "1000", "1001", "1010", "1011",  
    				  "1100", "1101", "1110", "1111" &#125;;
    Manquait-il autre chose ?

    Oui. Par contre, la valeur numérique est déjà en binaire. Il suffit donc de tester chaque bit de la valeur et de le convertir en '0' ou '1'. Ca doit pas être trop dur...
    Tu pensais à quelque chose du style (mask étant initialisé à 0x08)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for&#40;j=0; j<4; j++&#41;
    			&#123;
    				if &#40;index & mask&#41;
    					*dest++ = '1';
    				else
    					*dest++ = '0';
    				mask >>= 1;
    			&#125;

  8. #8
    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 jack69
    Ce code est incomplet
    J'ai oublié la déclaration de tab que j'avais réalisé en" globale" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* tab&#91;16&#93; = &#123; "0000", "0001", "0010", "0011",
    				  "0100", "0101", "0110", "0111", 
    				  "1000", "1001", "1010", "1011",  
    				  "1100", "1101", "1110", "1111" &#125;;
    Ca sert donc à traiter la valeur numérique par quartets... Pourquoi pas...
    Manquait-il autre chose ?
    des fichiers d'en-tête...
    Oui. Par contre, la valeur numérique est déjà en binaire. Il suffit donc de tester chaque bit de la valeur et de le convertir en '0' ou '1'. Ca doit pas être trop dur...
    Tu pensais à quelque chose du style (mask étant initialisé à 0x08)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for&#40;j=0; j<4; j++&#41;
    			&#123;
    				if &#40;index & mask&#41;
    					*dest++ = '1';
    				else
    					*dest++ = '0';
    				mask >>= 1;
    			&#125;
    Oui, on devrait pouvoir écrire du code générique dans ce style. Mais ta méthode, bien qu'atypique, n'est pas si mal...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut
    Citation:
    des fichiers d'en-tête...
    Désolé, c'était surtout pour avoir la précision sur le &courant. Mais effectivement pour ceux qui essayent de recompiler c'est galère. J'y penserai la prochaine fois.

    Oui, on devrait pouvoir écrire du code générique dans ce style. Mais ta méthode, bien qu'atypique, n'est pas si mal...
    Ca me rassure !! J'avais peur d'avoir ré-inventé la roue. Mais bon, comme je fais ca entre deux mesures et trois tests....

    En tout cas merci pour ton aide.

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

Discussions similaires

  1. [Conversion] Hexa -> binaire
    Par noOneIsInnocent dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2011, 12h00
  2. Conversion Hexa => binaire => décimal
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 6
    Dernier message: 10/04/2010, 14h53
  3. Conversion flux binaire -> ascii -> hexa
    Par identifiant_bidon dans le forum C++
    Réponses: 15
    Dernier message: 15/11/2007, 10h25
  4. [Debutant] Conversion Hexa en Binaire
    Par radskin dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 11h24
  5. Conversion ascii=> hexa=>binaire
    Par grunk dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 19h45

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