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 :

manipulations bit à bit


Sujet :

C

  1. #21
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    N'y a-t-il pas confusion entre bit et octet ?
    oui j ecris bit pour byte, il vaut mieux parler d'octet donc

    Les spécifications PNG demandent le MSB en premier. Attention, cela n'a de sens que pour les images où la profondeur pixel est supérieure à 8 bits, les images 3x8bits ou 4x8bits ne sont donc pas concernées.
    j'ai une image true color avec bit depth = 8. SI je comprend bien, j'ai donc effectivement MSB en premier.

    hexedit édite caractère par caractère.
    Si tu lis un entier avec fread, il va tenir compte de l'endianness de ton système.

    Si tu lis deux entiers 16 bits avec fread, il y a de fortes chances que tu obtiennes 9C 78 : 7D ED.
    voici mon appel à fread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int * c_pix;
    ....
          c_pix = (int*)malloc(sizeof(int));
          if(c_pix == NULL) {
    	fprintf(stderr,"Out of memory\n");
    	return 1;
          }
          fread(c_pix, 4, 1, fileIn);
    ...

  2. #22
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    j'ai une image true color avec bit depth = 8. SI je comprend bien, j'ai donc effectivement MSB en premier.
    Pas tout à fait :
    • chaque pixel est constitué de 4 composants.
    • chaque composant est codé sur 8 bits.


    La taille des pixels ne dépasse pas 8 bits par composant, la notion de MSB/LSB sur les pixels ne s'applique pas : dans les données décompressées, on a un octet rouge, un octet vert, un octet bleu, un octet alpha...

    En revanche, cette notion de MSB/LSB va s'appliquer au moment de la lecture si on lit des données depuis le fichier par bloc.
    Les processeurs x86 fonctionnent en little-endian (LSB en premier).
    Exemple : l'entier 0x00000001 sera écrit 01 00 00 00 dans un fichier binaire.

    Citation Envoyé par floopi51 Voir le message
    voici mon appel à fread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int * c_pix;
    ....
          c_pix = (int*)malloc(sizeof(int));
          if(c_pix == NULL) {
    	fprintf(stderr,"Out of memory\n");
    	return 1;
          }
          fread(c_pix, 4, 1, fileIn);
    ...
    Il y a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct pixel_s {
        unsigned char red;
        unsigned char green;
        unsigned char blue;
        unsigned char alpha;
    } pixel;
     
    pixel pix;
     
    fread(&pix, sizeof pix, 1, fileIn);
    Cela dit, les données lues par l'exemple précédent n'ont rien d'exploitable : elles sont encore compressées.
    Dernière modification par Invité(e) ; 06/01/2009 à 11h22.

  3. #23
    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 mabu Voir le message
    Il y a plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct pixel_s {
        unsigned char red;
        unsigned char green;
        unsigned char blue;
        unsigned char alpha;
    } pixel;
     
    pixel pix;
     
    fread(&pix, sizeof pix, 1, fileIn);
    Horriblement pas portable pour de nombreuses raisons. J'ai déjà donné le code qui fonctionne...

    http://www.developpez.net/forums/m3910592-11/

  4. #24
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par mabu Voir le message
    Pas tout à fait :
    En revanche, cette notion de MSB/LSB va s'appliquer au moment de la lecture si on lit des données depuis le fichier par bloc.
    Les processeurs x86 fonctionnent en little-endian (LSB en premier).
    Exemple : l'entier 0x00000001 sera écrit 01 00 00 00 dans un fichier binaire.
    comment savoir si mon processeur fonctionne en little-endian ou big-endian ?

    Cela dit, les données lues par l'exemple précédent n'ont rien d'exploitable : elles sont encore compressées.
    mon fichier image est un png.
    je croyais que dans ce cas mes données n'étaient pas compressées ???

    Floopi51

  5. #25
    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 floopi51 Voir le message
    comment savoir si mon processeur fonctionne en little-endian ou big-endian ?
    Ca n'a strictement aucune importance. j'ai déjà donné le code portable qui fonctionne...

  6. #26
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Horriblement pas portable pour de nombreuses raisons. J'ai déjà donné le code qui fonctionne...

    http://www.developpez.net/forums/m3910592-11/
    j'ai essayé ce code mais mon problème c'est que je ne récupère pas séparément chacun des octets.

    Quel masque appliquer pour obtenir chaque octet dans un entier ?

    Floopi51

  7. #27
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ca n'a strictement aucune importance. j'ai déjà donné le code portable qui fonctionne...
    sans m'interesser au code, je voulais juste savoir comment savoir si mon processeur est little-endian ou big-endian ?

  8. #28
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je sais faire ça en run-time, mais je n'ai trouvé aucun moyen de tester (ni même simplement vérifier) l'endianness en compile-time: :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned short testEndian = 0x1234;
    if( *((unsigned char*)&testEndian) == 0x34 )
    {
    	/*Little-endian*/
    }
    else
    {
    	/*Big-endian*/
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #29
    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 floopi51 Voir le message
    j'ai essayé ce code mais mon problème c'est que je ne récupère pas séparément chacun des octets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
       unsigned r = fgetc(fp); /* MSB en tete */
       unsigned v = fgetc(fp);
       unsigned b = fgetc(fp);
       unsigned alpha = (fgetc(fp);
    C'était dur ?

  10. #30
    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 floopi51 Voir le message
    sans m'interesser au code, je voulais juste savoir comment savoir si mon processeur est little-endian ou big-endian ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
     
    int main (void)
    {
       unsigned char a[sizeof (int)] = { 1 };
       unsigned int i = (*(int *) a);
       printf ("My machine is %s endian\n", i == 1 ? "little" : "big");
     
       return 0;
    }

  11. #31
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
       unsigned r = fgetc(fp); /* MSB en tete */
       unsigned v = fgetc(fp);
       unsigned b = fgetc(fp);
       unsigned alpha = (fgetc(fp);
    C'était dur ?
    Quelle différence avec le code ci-dessous ?

    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
     
    struct pixel {
      unsigned int red;
      unsigned int green;
      unsigned int blue;
      unsigned int alpha;
    };
     
    ...
     
    {
         struct pixel * pix=NULL;
     
          pix = (struct pixel*)malloc(sizeof(struct pixel));
          if(pix == NULL) {
    	fprintf(stderr,"Out of memory\n");
    	return 1;
          }
          fread(&pix->red, 1, 1, fileIn);
          fread(&pix->green, 1, 1, fileIn);
          fread(&pix->blue, 1, 1, fileIn);
          fread(&pix->alpha, 1, 1, fileIn);

  12. #32
    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 floopi51 Voir le message
    Quelle différence avec le code ci-dessous ?

    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
     
    struct pixel {
      unsigned int red;
      unsigned int green;
      unsigned int blue;
      unsigned int alpha;
    };
     
    ...
     
    {
         struct pixel * pix=NULL;
     
          pix = (struct pixel*)malloc(sizeof(struct pixel));
          if(pix == NULL) {
    	fprintf(stderr,"Out of memory\n");
    	return 1;
          }
          fread(&pix->red, 1, 1, fileIn);
          fread(&pix->green, 1, 1, fileIn);
          fread(&pix->blue, 1, 1, fileIn);
          fread(&pix->alpha, 1, 1, fileIn);
    aucune, à part la simplicité de l'un des deux.... Je te laisse deviner lequel.

    Je suis néanmoins d'accord pour la structure, mais pourquoi une allocation dynamique ? Ne pas compliquer le code plus que nécessaire...
    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
     
    struct pixel {
      unsigned red;
      unsigned green;
      unsigned blue;
      unsigned alpha;
    };
     
     
    {
         struct pixel pix;
     
          pix.red = fgets(fp);
          pix.green = fgets(fp);
          pix.blue = fgets(fp);
          pix.alpha = fgets(fp);

  13. #33
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je suis néanmoins d'accord pour la structure, mais pourquoi une allocation dynamique ? Ne pas compliquer le code plus que nécessaire...
    il faut lire fgetc au lieu de fgets dans le code non ?

    j'utilise une allocation dynamique parce que j'insère ensuite la structure dan sune liste chaînée pour traiter ensuite les données.

    merci pour vos réponses.

    Floopi51

  14. #34
    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 floopi51 Voir le message
    j'utilise une allocation dynamique parce que j'insère ensuite la structure dan sune liste chaînée pour traiter ensuite les données.
    OK.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. manipulation de bits d'un byte
    Par orelero dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2008, 10h41
  2. word_t et Manipulation de bits
    Par fmichael dans le forum C#
    Réponses: 2
    Dernier message: 19/03/2007, 09h33
  3. [VS 2005] Manipuler des bits
    Par b_lob dans le forum C#
    Réponses: 5
    Dernier message: 05/02/2007, 09h51
  4. [Ada] Manipulation de "Bits"
    Par BoBy9 dans le forum Ada
    Réponses: 2
    Dernier message: 14/06/2006, 11h57
  5. Manipulation de bits
    Par Tsly dans le forum C++
    Réponses: 2
    Dernier message: 28/09/2005, 12h41

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