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 :

Extraction de bits à partir du chaine de caracteres hexa


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut Extraction de bits à partir du chaine de caracteres hexa
    Bonjour,

    J'ai une chaine composés de 117 caracteres. Cette chaine est en faite une representation hexadecimale d'un message binaire. ce message binaire est composé de plusieurs champs de taille différentes. Mon but est donc a partir de ma chaine de caractere d'extraire chaque champ et de recuperer sa valeur decimale.

    Par ex :
    j'ai la chaine : "a1c256e7........"
    Sa representation binaire est donc : 1001 0001 1100 0010 ......
    les 2 premiers bits consitue une donnée, les 5 suivantes une autre et ainsi de suite

    Pour le moment, je fais le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    - strncpy(sous_chaine, chaine_complete(i), longueur)
    - sscanf(sous_chaine,"%x",valeur_hexa)
    - application d un masque sur la valeur hexa pour garder les bits qui m interessent
    - decalage de n bits vers la droite si necessaire pour recaler la valeur
    Est ce la bonne methode ???

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Ça me parait suffisant si tu n'as jamais de champ de bits qui traverse la "barrière" tous les huit caractères...
    Encore que, tu peux utiliser strtoul() plutôt que sscanf()...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ça me parait suffisant si tu n'as jamais de champ de bits qui traverse la "barrière" tous les huit caractères...
    en fait, j'ai souvent ma donnée qui est à cheval sur plusieurs octets. c'est à dire qui commence sur le 2ème bit d'un octet et fini sur le 3ème d'un autre par exemple

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Dans ce cas, j'imagine plutôt une fonction GetBit() du genre:
    1. prendre directement le quartet correspondant (un seul caractère)
    2. convertir le caractère hexa en entier (pratiquement trivial en ASCII comme en EBCDIC)
    3. Faire le bon décalage

    Et appeler cette fonction autant de fois que nécessaire

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Pour GetBit(), je vois bien un truc de ce genre-là, mais je n'ai pas testé:
    Code C : 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
    #include <ctype.h>
    #include <stddef.h>
    #include <assert.h>
     
    /* Retourne la valeur de tout caractère hexadécimal.
       Si c n'est pas un caractère hexadécimal,
       le comportement est indéfini. */
    int HexToNibble(char c)
    {
    	assert( isxdigit(c) );
    	if(isdigit(c))
    		return c - '0';
    	else if(islower(c))
    		return c - 'a' - 10;
    	else
    		return c - 'A' - 10;
    }
     
    /* Retourne la valeur du bit dans la chaîne hexa.
       Si offset est supérieur ou égal à quatre fois la longueur de la chaîne,
       ou si la chaîne comporte des caractères non-hexadécimaux,
       le comportement est indéfini */
    int GetBit(char const * strHex, size_t offset)
    {
    	int nibble = HexToNibble(strHex[offset/4]);
    	int mask = 1 << (3 - offset%4);
    	return ((nibble & mask) != 0);
    }
    Note que ce GetBit() se fait en temps constant (O(1), le temps d'exécution ne dépend pas de l'offset ni de la longueur de la chaîne)

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    Merci Medinoc, ça me permet d'avancer
    Je reviens vers toi si j'ai souci

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

Discussions similaires

  1. Extraction des mots d'une chaine de caractere
    Par ahd261 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/04/2009, 20h16
  2. extraction des mots à partir dune chaine de caractères
    Par khaledklaud dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2008, 17h13
  3. [T-SQL]Conversion chaine de caracteres -> HEXA
    Par julio84 dans le forum Sybase
    Réponses: 1
    Dernier message: 21/09/2006, 09h28
  4. [SYBASE][T-SQL]Conversion chaine de caracteres -> HEXA
    Par julio84 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/09/2006, 17h28
  5. convertir a partir de chaine de caractere
    Par hammacom dans le forum Java ME
    Réponses: 1
    Dernier message: 24/07/2006, 09h26

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