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 d'en tete d'un fichier binaire!


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut Lecture d'en tete d'un fichier binaire!
    Bonjour a tous,

    Voila j'essaye de comprendre un tuto qui utilise une image TGA.
    Si j'ai bien compris les fichiers TGA sont des fichiers binaires, avec une en tete me permettant de recuperer la longueur et la largeur de l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    // En-tête codée sur 18 octets
    unsigned char header[18];
    ...
    // Lecture de l'en-tête
    fichier.read((char*)header, 18);
    ...
    // Le 12 et 13ième octet correspondent à la longueur
    this->longueur = (header[13] << 8) + (unsigned int)header[12];
    // Le 14 et 15ième octet correspondent à la largeur 
    this->largeur = (header[15] << 8) + (unsigned int)header[14];
     
    this->bpp = (header[16]) >> 3;
    Si je comprends bien "fichier" est donc lu sur 18 octets et "header" est rempli par la valeur de chacun de ces octets.

    Je ne comprends pas les surcharges d'operateur << 8 et >> 3. Je pense que je vais dire une anerie mais bon il faut apprendre! cela lit les 8 bits du 12e et 14e octet de l'en tete du TGA, c'est ca?

    Quelqu'un peu t il m'expliquer?

    Merci par avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Par défaut
    le << est aussi l'opérateur de bits :
    http://cpp.developpez.com/cours/cpp/

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut
    Bon je ne comprends rien au binaire, donc...

    1 char = 1 octet = 8 bits
    Un fichier binaire c'est une succession de 0 ou de 1.
    header[13] <=> valeur entre 0000 0000 et 1111 1111.

    si header[13] <=> 1000 0000
    header[13] << 8 <=> 1 ou à la valeur du bit placé 8 bits avant le 1 dasn le fichier binaire.

    Je en sais si je suis clair la !

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    L'astuce, c'est que tu obtiens les valeurs "regroupées" par 8 bits (l'équivalent d'un "char") et que tu veux les utiliser sous la forme d'un entier.

    Le problème vient du fait que les (ici) 2 octets qui représent une valeur unique sont enregistrés... dans le mauvais ordre, et qu'il faut "rétablir les choses":

    En effet, visiblement, les 8 bits de poids faibles sont enregistrés avant les 8 bits de poids fort.

    Il faut donc prendre le deuxième octet, en multiplier la valeur par 256 (ce qui est fait en décalant les bits de 8 bit grace au << 8) et y ajouter la valeur du premier octet...

    Le code pourrait très bien fonctionner sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int longueur=((unsigned int) header[13]*256) +((unsigned int) header[12]);
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut
    merci de ta reponse,

    je suis aller regarder quelque truc sur les operateur binaire et j'ai enfin compris.

    << x <=> decale sur la gauche (ce qui etait incomprehensible pour moi) <=> multiplie par 2 pour chaque decalage soit 2^x, ici 2^8 = 256 (donc 1 octet)
    >> x <=> decale sur la droite <=> divise par 2 pour chaque decalage soit 2^x.

    Effectivement c'est plus simple à comprendre si on ecrit " *256 ", mais ca m'aura permis de me pencher sur la question

    Encore merci

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

Discussions similaires

  1. Lecture erronée de float dans un fichier binaire
    Par Bourrine dans le forum Langage
    Réponses: 10
    Dernier message: 23/05/2012, 09h12
  2. lecture dans un graph d'un fichier binaire
    Par vivi22 dans le forum LabVIEW
    Réponses: 5
    Dernier message: 26/05/2010, 15h51
  3. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56
  4. [fichier binaire]lecture ecriture dump
    Par parsy dans le forum Langage
    Réponses: 7
    Dernier message: 10/08/2005, 18h40
  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