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

Langage C++ Discussion :

Format binaire et Norme IEEE


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 80
    Points : 58
    Points
    58
    Par défaut Format binaire et Norme IEEE
    J'ai un soucis avec les fichiers binaires. Dans les FAQS, j'ai récupéré un code concernant le traitement des fichiers binaires.
    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
    float Convert::ConvertBinToFloat(int pos, int size)
    {
     float xin;
     ifstream FileIn("Toto.txt", ios_base::binary);
     
     if (pos <= size)
     {
       FileIn.seekg( pos,ios_base::beg );
       FileIn.read(reinterpret_cast<char*>(&xin), sizeof(float));
       position += (int)sizeof(float);
       FileIn.close();
       cout<<" valeur " <<xin<<" Taille du fichier "<<size<<" position "<<position<<endl;
       return xin;
     }
     
     return 0;
    }

    Dans mon fichier, j'aurais des données de types float sur 32 bits à la norme IEEE (j'ai du mal à voir comment fonctionne un nombre écrit sous la forme IEEE (signe 1 bit mantice 23 bits exposant 8 bits).

    Je voulais savoir si le programme ci-dessus va me permettre de les traiter convenablement.

    Merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Pas forcément, savoir que les flottants sont en 32 bits IEEE (754 je suppose) ne suffit pas, il faudrait également savoir dans quel ordre sont les octets (little-endian, big-endian).

    En gros la norme IEEE définie comment représenter un flottant par une suite de bits, elle ne définie pas comment sont rangés ces bits dans les octets de ton fichier.

  3. #3
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Ok, pour l'information. Je voulais quand même savoir si :
    - fichier + système en big endian : la méthode au dessus marche ?
    - fichier + système en little endian : la méthode au dessus marche ?

    J'ai regardé pas mal de doc sur internet concernant la conversion big - little d'un fichier binaire. Mais je n'ai pas tout compris. Si quelqu un pouvait m'éclairer?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut, et bienvenue sur le forum
    Citation Envoyé par luffy64 Voir le message
    Ok, pour l'information. Je voulais quand même savoir si :
    - fichier + système en big endian : la méthode au dessus marche ?
    - fichier + système en little endian : la méthode au dessus marche ?
    Oui, si tu es sur que le fichier a été écrit sur un système utilisant le même boutisme, le "simple" fait de le lire de la manière que tu présente suffira.

    Par contre, les choses se corseront si tu essaie de lire un fichier écrit sur un système gros boutiste (big endian) au départ d'un systeme petit boutiste (little endian), ou inversement.

    Dans ce cas, il faudra:
    1. qu'une specification précise le boutisme utilisé pour écrire le fichier et/ou
    2. être en mesure de disposer, dans le fichier (en lisant le premier byte par exemple) d'une information nous donnant le boutisme utilisé
    3. écrire une portion de code specifique selon le boutisme du système sur lequel l'application lit le fichier afin de convertir le réel en cas de besoin (sur base des informations (1) et /ou (2) )

    J'ai regardé pas mal de doc sur internet concernant la conversion big - little d'un fichier binaire. Mais je n'ai pas tout compris. Si quelqu un pouvait m'éclairer?
    La conversion de big en little endian (et inversément) d'une valeur 32 bits se fait relativement simplement, en
    • intervertissant le premier byte avec le dernier
    • intervertissant le deuxième byte avec le troisième
    tu peux envisager d'utiliser les fonction htonl (Host To Net Long) et ntohl (Net To Host Long), mais tu peux, également, envisager d'écrire ta propre fonction qui prendrait une forme proche de
    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
     
    void otherEndianness(long & l)
    {
        if(mustBeConverted)
        {
            char *temp =reinterpret_cast<char*>(&l);
            /* inversion des bytes 0 et 3 */
            temp[0]^=temp[3];
            temp[3]^=temp[0];
            temp[0]^=temp[3];
            /* inversion des bytes 1 et 2 */
            temp[1]^=temp[2];
            temp[2]^=temp[1];
            temp[1]^=temp[2];
        }
    }
    ou MustBeConverted est une valeur booléenne déterminant s'il faut convertir la valeur ou non définie par ailleurs

  5. #5
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Merci pour ta réponse.
    Peux tu me dire maintenant à quoi sert l'opérateur ^= que tu utilises ?


    Si je travaille sur 64 bits, j'intervertis le byte 0 avec le byte 7, le 2 avec le 6 et etc ?

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par luffy64 Voir le message
    Merci pour ta réponse.
    Peux tu me dire maintenant à quoi sert l'opérateur ^= que tu utilises ?
    l'opérateur ^ est l'opérateur XOR (ou exclusif), ici, associé à l'opérateur d'affectation =...

    C'est l'application du même principe que celui qui te fait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i=10;
    int j= 15;
    i+=j;
    cout<<i<<endl; //affiche 25
    Si je travaille sur 64 bits, j'intervertis le byte 0 avec le byte 7, le 2 avec le 6 et etc ?
    C'est bien cela

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

Discussions similaires

  1. [RUP] Template RUP & Normes IEEE
    Par Yann21 dans le forum xUP
    Réponses: 9
    Dernier message: 27/08/2008, 18h29
  2. Déclaration constante au format binaire sous D7
    Par DavidDB dans le forum Débuter
    Réponses: 2
    Dernier message: 07/07/2008, 22h20
  3. Encodage d'un nombre à la norme IEEE 754
    Par Letinono dans le forum Débuter
    Réponses: 11
    Dernier message: 31/05/2008, 15h42
  4. Format pour fichier énorme (> 4 Go)
    Par omda2006 dans le forum Fortran
    Réponses: 1
    Dernier message: 14/12/2006, 13h15
  5. afficher un nombre sous format binaire?
    Par sofiane44 dans le forum C++
    Réponses: 2
    Dernier message: 20/01/2006, 18h47

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