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 :

application de masques sur un chaine de caractères


Sujet :

C

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut [Résolu] application de masques sur un chaine de caractères
    Bonjour,

    je possède une chaine de caractères qui contient en fait un DWORD, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * chaine = "2A000014"
    or j'aimerais pouvoir appliquer des masques pour pouvoir récupérer a chaque tour de boucle chacun des bits pour les deux premiers caractères, puis la valeur du reste en décimal. Dans notre exemple je voudrais donc que cela renvoie:

    0, 0, 1, 0, 1, 0, 1, 0, 20
    Est-ce que quelqu'un a une idée pour faire cela? merci d'avance.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    peut tu developpez (c le cas de le dire ) un peu plus stp
    il y a trois sortes de personnes : celles qui savent compter et celles qui ne savent pas compter ...

  3. #3
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut oui
    oui:

    2 en hexadécimal c'est 0010 en binaire
    A en hexadécimal c'est 1010 en binaire
    et enfin 000014 en hexadécimal c'est 20 en décimal.

    je possède la chaine de caractères 2A000014 et je voudrais passer cela dans une petite boucle et récupérer successivement:

    0
    0
    1
    0
    1
    0
    1
    0

    et une fois la boucle finie récupérer

    20.

    et je ne sais pas trop comment faire ca!

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    je crois qu il va te falloir faire qques petite fonctions
    deja tu prend caractere par caractere tu enleve 30 (en hexa) si c un chiffre et tu enleve 37 (tjs en hexa) si c est une lettre ca te permettra de te defaire de l'ascii
    ensuite tu te fait un tableau de 4 caractere (ca representera par exemple '0','0','1','0') et ces sur ca que tu vas travailler tu vas faire une boucle qui va ajouter a ton tableau ( a toi de bien faire ) 1 donc si j ai 0,0,1,0 je dois obtenir 0,0,1,1 et si j ajoute encore 1 je dois avoir 0,1,0,0 (c peut etre le plus dur a faire)
    ta boucle sera faite autant de fois que le caractere de ta chaine principale (ici 2 puis A (elle sera faite 10 fois puisque Ah=10d)) et ainsi de suite
    par contre pas d idée pour le chiffre qui suit
    si je j ai le temps de te faire un peu de code je te le fais sinon essaie de bien comprendre ma demarche et n'hesite pas a poser des questions
    il y a trois sortes de personnes : celles qui savent compter et celles qui ne savent pas compter ...

  5. #5
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut merci
    merci pour l'idée, je vais essayer.

  6. #6
    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 : 750
    Points
    750
    Par défaut
    Tu peux utiliser strtol pour passer d'une nombre en hexa dans une chaine en un long.

    Apres, tu peux utiliser 3 fois cette fonctions,
    2 fois pour les 2 premiers caractere, avec en plus un tableau (de char si tu veux des char '0', '1', ou int si tu veux 0, 1)
    1 fois pour la valeur qui reste.
    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
     
    int tab[16][4]={ 
        {0,0,0,0},
        {0,0,0,1},
        {0,0,1,0},
        {0,0,1,1},
        {0,1,0,0}, ...
    }
     
    int *decomp(char *str){
        char temp[2];
        int *de;
        de=(int *)malloc(9*sizeof(int));
        temp[0]=str[0];
        temp[0]='\0';
        memcpy(&de[0],tab[strtol(temp,NULL,16)],sizeof(int));
        temp[0]=str[1];
        memcpy(&de[4],tab[strtol(temp,NULL,16)],sizeof(int));
        de[8]=strtol(str+2,NULL,16);
        return de;
    }
    [edit] arguments de strtol ajoutes

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je sais pas si ca t'aide vraiment mais regarde ce code pour afficher une valeur(chaine) en binaire :

    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
    #define LONG_BIT 32
    char* unsigned_long_to_text(long val)
    {
     unsigned long ul = (unsigned long)val ;
    unisgned long mask = UNLONG_MAX - (UNLONG_MAX >> 1) ;
    static char result [LONG_BIT +1] ;
    char* p= result ;
    while(mask)
     {
     *p=(char)('0' + ((ul & mask) !=0 )) ;
    *p++ 
    mask >>=1 ;
     }
    *store='\0' ;
    return result ;
    }
     
    /* le main */
    long num=3214569 ;
    printf("%s\n", unsigned_long_to_text(num)) ;
    return 0 ;
    }
    J'espère que ca peut t'aider ou te mettre sur la voie de qch .

    Nas'

  8. #8
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut Merci
    Merci à tous, et notemment à D[r]eadLock, cela fonctionne, mais attention c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(&de[0],tab[strtol(temp,NULL,16)],4*sizeof(int));
    et non pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(&de[0],tab[strtol(temp,NULL,16)],sizeof(int));

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

Discussions similaires

  1. [CR 10] Traitement sur les chaines de caractères
    Par sylviefrfr dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 11/09/2006, 09h16
  2. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 18h55
  3. Dégradé sur une chaine de caractères avec 3 a 4 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/03/2006, 13h21
  4. Masque sur une chaine
    Par Weedo dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/01/2006, 11h32
  5. xsl : test sur les chaine de caractère
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/07/2005, 15h43

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