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 :

Format, bits et masques


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Format, bits et masques
    Bonjour à tous,

    Je me permets de lancer une nouvelle discussion car ne suis pas parvenu à trouver la réponse à ma question, qui pourtant ne doit pas être bien compliquée...

    Je réalise actuellement un outil de conversion de fichier pour transformer des fichiers XML en fichier binaire.

    Voici mon problème:

    Je cherche à former un octet de ce type: 0 V Id

    - "V" est une valeur en hexadécimal (ici, "0" ou "1") que je vais récupérer dans une balise de mon fichier XML.
    - "Id" est une valeur hexadécimale que je récupère dans une grammaire associé à mon fichier XML.

    Pour se faire, j'utilise des masques et le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Récupération de l'identifiant
    xmlChar	*id = NULL;
    id = xmlGetProp( current, (const xmlChar*)"id");
     
    // Récupération de la variable "var" à l'aide d'une fonction retournant un xmlChar*
    xmlChar  *var = NULL;	
    var = get_child_node_content((xmlNode *)xpathObj_value, &path_current[0], 1);
     
    char       *var_hexa;
     
    // On positionne le bit 7 à "0" ou "1" en fonction de la valeur de "var" et on ajoute l'identifiant à l'octet
    *var_hexa = ( *id & 0x3F) | (7<<( *var & 1) );
    Cependant, lorsque j'affiche le résultat de var_hexa,, j'obtiens une suite de caractère spéciaux me laissant penser à un souci de format. Ma première idée était de me dire que la variable var devait être récupérée en ASCII et qu'il fallait que je la transforme en hexa pour effectuer le traitement avec les masques. Mais j'avoue être un peu perdu d'où le fait que je vous sollicite.

    J'espère avoir été clair, et que vous arriverez a me sortir de ce petit souci (qui devient urgent... ^^)

    Merci et bonne journée

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu récupères des chaines de caractères. Donc, par exemple, si var = "0" alors *var vaut '0', le code ASCII (si le code ASCII est celui qui est utilisé) du caractère '0', pas la valeur entière 0. Si tu veux travailler avec la valeur entière 0, il faut effectuer une conversion ASCII->entier. Même remarque pour var.

    Autre chose, *var_hexa = ... est faux : var_hexa est un pointeur non initialisé.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci Diogene pour ta réponse. Je galère quelque peu vu que je débute dans ce langage...

    Si je met ceci, serait ce déjà plus correct?

    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
     
    // Récupération de l'identifiant
    xmlChar	*id = NULL;
    id = xmlGetProp( current, (const xmlChar*)"id");
     
    // Récupération de la variable "var" à l'aide d'une fonction retournant un xmlChar* 
    xmlChar  *var = NULL;	
    var = get_child_node_content((xmlNode *)xpathObj_value, &path_current[0], 1);
     
    char       *var_hexa = NULL;
    int *V = NULL;
    int *identity = NULL;
    																										identity = atoi((char*)id);									V=atoi((char*)var);
     
    // On positionne le bit 7 à "0" ou "1" en fonction de la valeur de "var" et on ajoute l'identifiant à l'octet
    *var_hexa = ( *id & 0x3F) | (7<<( *var & 1) );

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Changement de direction

    Je suis arrivé à ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char var_hexa;
    sscanf((char *)var, "%02x", (unsigned int *)&var_hexa);
    printf("var_hexa: %02x \n", var_hexa);
     
    char id_hexa;
    sscanf((char *)id, "%02x", (unsigned int *)&id_hexa);
    printf("id_hexa: %02x \n", id_hexa);
     
    char octet_res;
    octet_res = ( id_hexa & 0x3F) | (7<<(var_hexa & 1)); 
    printf("octet_res: %02x \n", octet_res);
    avec var valant 1, et identifiant valant 9 (valeurs hexadécimale).

    Je devrais donc retrouver dans octet_res la valeur 49... cependant je trouve 0f... quelqu'un aurait il une explication? merci =)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Première remarque : qu'est-ce que c'est tous ces casts dans ton code ? Si c'est pour cacher des warnings du compilateur, ce n'est clairement pas une bonne idée.

    par exemple remplace (à vérifier, je mets ça comme ça)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char var_hexa;
    sscanf((char *)var, "%02x", (unsigned int *)&var_hexa);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char var_hexa;
    sscanf(var, "%c", &var_hexa);
    De la même façon, tu dois pouvoir enlever le (const xmlChar*).

    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    octet_res = ( id_hexa & 0x3F) | (7<<(var_hexa & 1));
    si id_hexa vaut 9 et var_hexa 1, alors ( id_hexa & 0x3F) vaut 0x9 et (7<<(var_hexa & 1)) vaut 0xE et comme 0x9|0xE=0xF, tout va bien.

    Ton problème, c'est que tu veux plutôt faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    octet_res = ( id_hexa & 0x3F) | ((var_hexa & 1)<<7);

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ceci me semble plus correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned int var_hexa;
    sscanf(var, "%02x", &var_hexa);
    printf("var_hexa: %02x \n", var_hexa);
     
    unsigned int id_hexa;
    sscanf(id, "%02x", &id_hexa);
    printf("id_hexa: %02x \n", id_hexa);
     
    unsigned char octet_res;
    octet_res = ( id_hexa & 0x3F) | ((var_hexa & 1)<<7); 
    printf("octet_res: %02x \n", octet_res);
    @gulain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char var_hexa;
    sscanf(var, "%c", &var_hexa);
    Si il fait ça, il va récupérer le code ASCII du caractère.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci beaucoup a tous les deux pour votre aide!! J'avais en effet un petit souci de décalage et le code que vous m'avez fourni fonctionne parfaite. Un grand merci!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Merci pour la relecture diogene.

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

Discussions similaires

  1. format date et masque de saisie
    Par mathis86 dans le forum Access
    Réponses: 5
    Dernier message: 05/07/2012, 15h28
  2. [bit de masque] Conversion d'un byte signé
    Par ryosnake dans le forum Java ME
    Réponses: 4
    Dernier message: 28/08/2008, 12h18
  3. problème d'affichage d'une image au format DDS (24-bit)
    Par thunderbird dans le forum DirectX
    Réponses: 2
    Dernier message: 22/03/2006, 11h00
  4. Format WAV/PCM,long 4 octets et masques PHP
    Par juki dans le forum Langage
    Réponses: 3
    Dernier message: 29/01/2006, 18h57
  5. Réponses: 3
    Dernier message: 22/09/2005, 10h34

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