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 d'une série de bits dans un char* en entier ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Conversion d'une série de bits dans un char* en entier ?
    Bonjour

    J'ai à ma disposition un char* contenant 8 caractères représentant des bits.
    Exemple ( je sais que ça ne compile pas, mais c'est pour résumer ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* serie = "10011010";
    Je souhaiterais convertir cette suite de bits "serie" ( donc ce char* ) en un entier.
    Ainsi, dans mon exemple, cela donnerait 154.

    Quelqu'un aurait-il une idée, ou au moins pourrait me mettre sur la voie ?

    Merci d'avance

  2. #2
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut tu fais
    Salut,
    Voila je peux seulement te mettre sur la vois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int p=1,s=0;
    for(i=0 ; i<lenghtofserie ; i++)
    {
        p*=2;
        s+= serie[i]*p;
    }
    fprintf("%s est égale en décimal %d ",serie,s);
    Pour appliquer ce code vous devez connaitre la longueur de votre chaine char* serie.
    - Microsoft Dynamics AX Technical Expert
    - OpenERP Module Developper
    - Mécanicien informaticien passioné
    - CV : http://www.viadeo.com/fr/profile/mohamed-amine.

  3. #3
    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 d'une série de bits dans un char* en entier ?
    Citation Envoyé par FenX.
    J'ai à ma disposition un char* contenant 8 caractères représentant des bits.
    Un 'char*' ça ne contient rien d'autre qu'une addresse. Ce n'est pas un tableau, mais un pointeur.

    http://emmanuel-delahaye.developpez.....htm#char_star

    Exemple ( je sais que ça ne compile pas, mais c'est pour résumer ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* serie = "10011010";
    Pourquoi ça ne compilerait pas ?
    Je souhaiterais convertir cette suite de bits "serie" ( donc ce char* ) en un entier.
    Ainsi, dans mon exemple, cela donnerait 154.

    Quelqu'un aurait-il une idée, ou au moins pourrait me mettre sur la voie ?
    strtoul() avec la base 2.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Re: tu fais
    Citation Envoyé par ccensam
    Pour appliquer ce code vous devez connaitre la longueur de votre chaine char* serie.
    On peut pas détecter le caractere '\0'???!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *a="1000101";
        int i=0;
        do{
             printf("%c",*(a+i));
             i++;
             }while(*(a+i)!='\0');
    Ca marche nickel et en récuperant i on a la longueur de la chaine:
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  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 Re: tu fais
    Citation Envoyé par seriousme
    On peut pas détecter le caractere '\0'???!!!
    Si, bien sûr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <...>
             printf("%c",*(a+i));
    <...>
             }while(*(a+i)!='\0');
    <...>
    [/code]
    est une façon compliquée d'écrire
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Pour convertir une chaine de caractères composée de 0 et de 1 en un entier il suffit d'utiliser les opérateurs binaires, et avant tout de traduire des données ASCIIsées en nombres !

    Je n'en dis pas plus

    jef

  7. #7
    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 jfg31
    Pour convertir une chaine de caractères composée de 0 et de 1 en un entier il suffit <...>
    Non. On utilise strtoul() avec la base 2.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    connaissait pas! C'est bien utile tout de même.

  9. #9
    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 jfg31
    connaissait pas!
    Pourtant mentionné dans le même fil...

    http://www.developpez.net/forums/vie...667651#2667651

    C'est pas bien de débarquer dans un fil sans lire les messages...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut Evidement strtol
    Puisque vous avez une chaine de 8 caractères voila deux possibilités :
    Possibilité 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int main()
    {
           int i,a=0,base=1;
           char nbr[8]="10010011"; // Juste exemple
           for(i=0;i<8;i++) 
           {
                a+=nbr[i]*base;
                base*=2;
           }
           printf("%s est égale à %d",nbr,a);
           return 1;
    }
    Possibilité 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {
           int a=0;
           char nbr[8]="10010011"; // Juste exemple
           a=strtoul(nbr,2);
           printf("%s est égale à %d",nbr,a);
           return 1;
    }
    On peut dire que la première méthode est le principe de fonctionnement de strtoul(). Car on peut l'utiliser pour la conversion dans toutes les bases inférieures à 9,il suffit de de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    base*=2; =====> base*=basesouhaité;
    - Microsoft Dynamics AX Technical Expert
    - OpenERP Module Developper
    - Mécanicien informaticien passioné
    - CV : http://www.viadeo.com/fr/profile/mohamed-amine.

  11. #11
    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: Evidement strtol
    Citation Envoyé par ccensam
    Puisque vous avez une chaine de 8 caractères voila deux possibilités :
    Possibilité 1
    Ce code est extrèmement faux. Il faut arréter de raconter n'importe quoi et vérifier...
    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
     
    /* -ed- manque <stdio.h> */
     
    int main()
    {
           int i,a=0,base=1;
     
           char nbr[8]="10010011"; // Juste exemple
    /* -ed- chaine mal formee (pas de 0 final) */
     
           for(i=0;i<8;i++) 
           {
                a+=nbr[i]*base;
    /* -ed- nbr[i] est une valeur de caractere. Il manque un " - '0' "... */
     
                base*=2;
           }
           printf("%s est égale à %d",nbr,a);
    /* -ed- comme la chaine est mal formee, comportement indefini. 
               Manque un '\n' */
     
           return 1;
    /* -ed- pas portable (0, EXIT_SUCCESS, EXIT_FAILURE) */
     
    }
    Quand à strtol(), il y a 3 paramètres... Bref, il vaut mieux commencer par lire et poser des questions avant que de prétendre répondre quand on y connait rien. J'ai pas que ça à faire que de corriger des c*nneries...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut MAIS MAIS....
    Citation Envoyé par Emmanuel Delahaye
    Ce code est extrèmement faux. Il faut arréter de raconter n'importe quoi et vérifier...
    Mais l'idée reste toujours vraie.Il suffit de corriger le 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
     
    #include <stdio.h>
    int main()
    {
           int i,a=0,base=1;
           char nbr[8]="10010011\0";      // Juste exemple
           for(i=7;i>=0;i--)
           {
                a+=(nbr[i]-'0')*base;
                base*=2;
           }
           printf("%s est égale à %d",nbr,a);
           return EXIT_SUCCESS;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
           int a=0;
           char nbr[8]="10010011\0",*ptr; // Juste exemple
           ptr=nbr;
           a=strtoul(ptr,&ptr,2);
           printf("%s est égale à %d",nbr,a);
           return EXIT_SUCCESS;
    }
    - Microsoft Dynamics AX Technical Expert
    - OpenERP Module Developper
    - Mécanicien informaticien passioné
    - CV : http://www.viadeo.com/fr/profile/mohamed-amine.

  13. #13
    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: MAIS MAIS....
    Citation Envoyé par ccensam
    Citation Envoyé par Emmanuel Delahaye
    Ce code est extrèmement faux. Il faut arréter de raconter n'importe quoi et vérifier...
    Mais l'idée reste toujours vraie.Il suffit de corriger le code.
    Tu postes du code faux exprès pour qu'on ait à le corriger ? Tu crois que tu vas aider le newbie comme ça, en l'embrouillant encore plus ?

    As-tu testé ton code ? Le résultat n'est pas très joli...

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    int main(void)
    {
       int i, a = 0, base = 1;
       char nbr[] = "10010011";
       for (i = 7;i >= 0;i--)
       {
          a += (nbr[i] - '0') * base;
          base *= 2;
       }
       printf("%s = %X\n", nbr, (unsigned) a);
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Chercher une série de valeurs dans un multiset.
    Par undercrash dans le forum SL & STL
    Réponses: 1
    Dernier message: 24/10/2007, 10h18
  2. Réponses: 1
    Dernier message: 05/03/2007, 19h55
  3. Evaluer une série de valeurs dans une StringGrid
    Par fermat dans le forum Delphi
    Réponses: 1
    Dernier message: 24/09/2006, 18h35
  4. Réponses: 9
    Dernier message: 05/04/2006, 17h48
  5. Réponses: 2
    Dernier message: 17/08/2005, 14h40

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