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 :

Lecture de bits


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut Lecture de bits
    Bonjour je travaille sur les tags mp3 de versions 2 et il y a une information vitale qui est contenu sur un octet donc un char et ces informations sont définit sur les 3 premiers bits en partant du bit de poids fort de cet octet.

    Je me demande comment pouvoir lire le contenu de ses 3 bits. Jai vu qu'on pouvais peut etre utilisé les champs de bits sont-ils utilisables avec un char ?? Si il faut passer par les champs de bits j'aimerai bien comprendre comment ca fonctionne exactement car niveau syntaxe ca va mais niveau initialisation je suis un peu perdu.

    Mais il n'y aurais pas une méthode moins compliqué afin de connaitre l'état de 3 bits de poids fort ??

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    tu peux utiliser un masque et l'operateur logique &

    tu fait un ET bit a bit avec un masque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char p = 'z';
     
    if(p & 4)
    {
    printf("bit 2(from LSB) True\n");
    }

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    Bonjour je travaille sur les tags mp3 de versions 2 et il y a une information vitale qui est contenu sur un octet donc un char et ces informations sont définit sur les 3 premiers bits en partant du bit de poids fort de cet octet.

    Je me demande comment pouvoir lire le contenu de ses 3 bits. Jai vu qu'on pouvais peut etre utilisé les champs de bits sont-ils utilisables avec un char ??
    Surtout pas. Les champs de bits ne sont pas portables, on ne peut donc pas les utiliser pour réaliser des interfaces externes.

    http://emmanuel-delahaye.developpez....s.htm#bitfield

    Mais il n'y aurais pas une méthode moins compliqué afin de connaitre l'état de 3 bits de poids fort ??
    Il faut apprendre à utiliser les opérateurs bit à bit (Bitwise operators).

    >> << & | ~ ^

    Ceci peut aider :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module BITS


    Il y a des tutoriels sur le net...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il faut apprendre à utiliser les opérateurs bit à bit (Bitwise operators).

    >> << & | ~ ^

    Ceci peut aider :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module BITS
    J'ai étudié la bibliothèque bit.h je l'ai mis dans mon dossier include mais je t'avoue que je suis un peu perdu je vois bien qu'il y a des macros pour l'étude de chaque bit mais comment lui indiquer l'octet sur lequel je veux travaillé ??

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    J'ai étudié la bibliothèque bit.h je l'ai mis dans mon dossier include mais je t'avoue que je suis un peu perdu je vois bien qu'il y a des macros pour l'étude de chaque bit mais comment lui indiquer l'octet sur lequel je veux travaillé ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       unsigned x = 0; /* tous les bits à 0 */
     
       mSET (x, BIT2); /* met le bit 2 à 1 */
     
       printf (mGET (x, BIT1)); /* affiche la valeur du bit 1 (0 ou 1) */
     
       printf (mVAL (x, 2, 1)); /* affiche la valeur des bit 2 et 1 (00, 01, 10 ou 11) */
    Si tu veux tester les bits 7 6 5 de x, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       unsigned b765 = mVAL (x, 3, 5); /* donnee, largeur, LSB */
    Exemple :
    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
     
    #include "ed/inc/bits.h"
    #include <stdio.h>
     
    int main (void)
    {
       unsigned x = bit6; /* 0100 0000 */
     
       unsigned b765 = mVAL (x, 3, 5);
     
       printf ("%02X\n", b765); /* 010 soit 2 */
     
       /* bit 7 = 1 */
       mSET (x, bit7);
     
       b765 = mVAL (x, 3, 5);
     
       printf ("%02X\n", b765); /* 110 soit 6 */
     
       return 0;
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Jai donc implanter le tout.

    Je fais :

    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
     
    char v2[11];
     
    for(i=0;i<10;i++)
    {fread(&v2[i],sizeof(char),1,tag->g);}
     
            if(v2[0]=='I' && v2[1]=='D' && v2[2]=='3')
            {
               unsigned flag;
     
                mSET(flag,v2[5]);
     
                unsigned b765 = mVAL (flag, 3, 5);
                printf("\n valeur : 0x%02X\n", b765);
    }
    J'ai une petite erreur car j'ouvre un fichier1 que je le lis et je fais le printf il m'affiche 0x07 lorsque j'ouvre un fichier2 si il m'affiche 0x01 et quand je reviens sur le fichier1 il m'affiche plus 0x07 mais 0x01

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    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
     
    char v2[11];
     
    for(i=0;i<10;i++)
    {fread(&v2[i],sizeof(char),1,tag->g);}
     
            if(v2[0]=='I' && v2[1]=='D' && v2[2]=='3')
            {
               unsigned flag;
     
                mSET(flag,v2[5]);
     
                unsigned b765 = mVAL (flag, 3, 5);
                printf("\n valeur : 0x%02X\n", b765);
    }
    Le macros mSET(), mCLR() et mTGL() n'ont de sens que si la donnée a été initialisée...

    Je pense que tu voulais plutôt faire

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Mais si je fais ceci :

    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
     
    char v2[11];
     
    for(i=0;i<10;i++)
    {fread(&v2[i],sizeof(char),1,tag->g);}
     
            if(v2[0]=='I' && v2[1]=='D' && v2[2]=='3')
            {
               unsigned flag;
     
                flag=v2[5]
     
                unsigned b765 = mVAL (flag, 3, 5);
                printf("\n valeur : 0x%02X\n", b765);
    }
    je n'obtiens que 0x00 quelque soit le fichier ouvert.

    Autre question : unsigned tout seul signifie koi car je ne connaissait pas ce type de donnée est ce équivalent a unsigned int ???

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    Mais si je fais ceci :
    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
     
    char v2[11];
     
    for(i=0;i<10;i++)
    {fread(&v2[i],sizeof(char),1,tag->g);}
     
            if(v2[0]=='I' && v2[1]=='D' && v2[2]=='3')
            {
               unsigned flag;
     
                flag=v2[5]
     
                unsigned b765 = mVAL (flag, 3, 5);
                printf("\n valeur : 0x%02X\n", b765);
    }
    je n'obtiens que 0x00 quelque soit le fichier ouvert.
    Autre question : unsigned tout seul signifie koi car je ne connaissait pas ce type de donnée est ce équivalent a unsigned int ???
    Oui. D'ailleurs, tu devrais utiliser unsigned char pour les données lues (v2[11]), parce que c'est la règle dès qu'on manipule des bits...

    Quand à ceci :

    for(i=0;i<10;i++)
    {fread(&v2[i],sizeof(char),1,tag->g);}

    Ca me parait bien tordu...

    Pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char v2[10];
     
       fread (v2, 1, sizeof v2, tag->g);
    C'est un peu fait pour non ?

    Sinon, pour la valeur lue de 0, ça parait logique avec ce que je lis :
    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
     
    #include "ed/inc/sys.h"
    #include "ed/inc/bits.h"
     
    #include <stdio.h>
    #include <string.h>
     
    #define FNAME "test.mp3"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "rb");
       if (fp != NULL)
       {
          unsigned char data[10];
     
          int n = fread (data, sizeof data, 1, fp);
     
          printf ("%d bloc%s lu%s\n", n, (n > 1) ? "s" : "", (n > 1) ? "s" : "");
     
          SYS_dump (data, sizeof data);
     
          if (strncmp (data, "ID3", 3) == 0)
          {
             unsigned flag = data[5];
     
             unsigned b765 = mVAL (flag, 3, 5);
             printf ("valeur : 0x%02X\n", b765);
          }
     
          fclose (fp);
       }
       else
       {
          perror (FNAME);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1 bloc lu
    0022FF50 49 44 33 03 00 00 00 00 00 75                    'ID3......u'
    valeur : 0x00
     
    Press ENTER to continue.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Ca pose donc un probleme car en réalité d'après la doc officiel des tags sur lesquels je travaille le char est a analysé ainsi :

    0xabc00000

    a, b, c sont les éléments a recueillir pour définir des actions par la suite

    mais si mon unsigned char de 1 octet est converti en unsigned int de 4 octets ou est ce que je trouve mes trois bits a,b et c ???

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    Ca pose donc un probleme car en réalité d'après la doc officiel des tags sur lesquels je travaille le char est a analysé ainsi :

    0xabc00000

    a, b, c sont les éléments a recueillir pour définir des actions par la suite

    mais si mon unsigned char de 1 octet est converti en unsigned int de 4 octets ou est ce que je trouve mes trois bits a,b et c ???
    J'ai rien compris. Tu peux donner la référence de la spécification exacte ? J'ai l'impresson que tu mélanges bits et bytes...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    ID3v2/file identifier "ID3"
    ID3v2 version $03 00
    ID3v2 flags %abc00000
    ID3v2 size 4 * %0xxxxxxx

    ....

    a - Unsynchronisation

    Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see section 5 for details); a set bit indicates usage.
    b - Extended header

    The second bit (bit 6) indicates whether or not the header is followed by an extended header. The extended header is described in section 3.2.
    c - Experimental indicator
    The third bit (bit 5) should be used as an 'experimental indicator'. This flag should always be set when the tag is in an experimental stage.
    On trouve ceci a cette page : http://www.id3.org/id3v2.3.0#sec3.2

    Il explique comment étudier l'en tete d'un tag mp3 de version 2 ce qui m'intéresse comme tu dois t'en douter c le flags

    Le flag représente un octet mais c'est le bit 7, 6 et 5 qu'i m'importe de lire afin de définir la suite des opérations

    La question que je me posais donc tout a leure était qu'étant donné que ce flags que je récupère ne représente qu'un octet comment puis je faire pour récupérer a, b et c si je le met dans un unsigned int de 4 octets

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par la_praline
    La question que je me posais donc tout a leure était qu'étant donné que ce flags que je récupère ne représente qu'un octet comment puis je faire pour récupérer a, b et c si je le met dans un unsigned int de 4 octets
    Pour récupérer les bits séparément, tu utilises mGET(), c'est fait pour :
    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
     
    #include "ed/inc/sys.h"
    #include "ed/inc/bits.h"
     
    #include <stdio.h>
    #include <string.h>
     
    #define FNAME "test.mp3"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "rb");
       if (fp != NULL)
       {
          unsigned char data[10];
     
          int n = fread (data, sizeof data, 1, fp);
     
          printf ("%d bloc%s lu%s\n", n, (n > 1) ? "s" : "", (n > 1) ? "s" : "");
     
          SYS_dump (data, sizeof data);
     
          if (strncmp (data, "ID3", 3) == 0)
          {
             unsigned flag = data[5];
             int a = mGET (flag, bit7);
             int b = mGET (flag, bit6);
             int c = mGET (flag, bit5);
     
             printf ("a=%d b=%d c=%d \n", a, b, c);
          }
     
          fclose (fp);
       }
       else
       {
          perror (FNAME);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1 bloc lu
    0022FF50 49 44 33 03 00 00 00 00 00 75                    'ID3......u'
    a=0 b=0 c=0
     
    Press ENTER to continue.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Par défaut
    Plutot que de m'embeter a faire tout ca je vais plutot me fier aux valeurs décimales retourné par le caractère ca sera plus simple pour moi merci bcp en tout cas emmanuel

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

Discussions similaires

  1. lecture de bit dans WinCC
    Par polen27 dans le forum Automation
    Réponses: 6
    Dernier message: 15/04/2008, 12h37
  2. Lecture de bits
    Par Benji59 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/04/2008, 11h56
  3. [WinCC-VBScript] lecture de bit
    Par ren973 dans le forum Automation
    Réponses: 7
    Dernier message: 12/07/2007, 16h07
  4. [WinCC-VBScript] lecture de bit
    Par ren973 dans le forum VBScript
    Réponses: 5
    Dernier message: 11/07/2007, 20h48
  5. Réponses: 5
    Dernier message: 03/06/2005, 14h06

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