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 :

Endianess et lecture fichier binaire


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut Endianess et lecture fichier binaire
    Bonjour,

    Je dois réaliser un programme qui lit un fichier binaire (qui peut avoir été écrit par nimporte quelle autre machine). Seulement je sais juste que mon fichier contient un int suivie d'un double et ensuite un uint (j'ai simplifié).

    Par exemple,

    -une machine A peut écrire ce fichier binaire avec un little endian
    8 octets pour int, 8 octets pour double et 8 octets pour l'uint
    Ca fait que le fichier binaire bin.dat a une taille de 24 octets

    -une autre machine B doit lire ce fichier bin.dat or cette machine est en big-endian et code les int sous 4 octets, les doubles sous 8 octets et les uint sous 4 octets. Dans ce cas la la machine B ne lira pas les données correctement.


    Donc ma question est comment faire pour que B détecte que A a codé l'int sous 8 octets et comment faire pour sauver cet entier sous 8 octets sous B?

    Au niveau de l'endianess je sais qu'il faut se fixé une règle pour dire que le fichier doit être ecrit en BIG endian par exemple et ainsi le lecteur sait qu'il doit inverser les octet si il est en little endian.

    Mais mon vri problème est au niveau de la taille des données comment les gérer ?

    Merci

    Algernon

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut PB endianess lecture fichier binaire C
    Une autre question, est-ce que il est préférable de passer en C#, car je crois que C# gère cela tout seul non?

    J'ai lus dans un cours que seul les ints ne sont pas portables, mais je pense que les double et les floats ne le sont pas non plus car leur taille peuvent différés d'une machine à une autre, est-ce vrai?


    Merci pour vos réponses

    Algernon

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pas de magie à ce niveau. Y compris en C#.
    C'est à toi de t'assurer que tes fichiers sont enregistrés (endianess et taille des données) correctement et de les lire dans le bon sens par la suite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Bonjour,

    Je sais bien qu'il n'y a pas de magie en C, mais ma question c'est pas ça (du moins pour le langage C)

    Merci quand meme

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    As-tu la maîtrise de programme de la machine A ?

    Si oui, peut-être en prenant le problème à l'envers :

    écrire en big endian avec la machine A. Comment ? Avec les fonction htonx ?
    Le souci sera sûrement le double.
    Cet article peut t'aider.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Merci pour la réponse,

    en fait je ne peux pas imposer aux autres machines (aux autres personnes de changer leur code qui écrit ces fichiers) car en fait le code écrit par quelqu'un d'autre à été écrit en C# et donc pas portable, ce qui veut dire que je dois savoir uniquement à partir du fichier l'endianess qui a été codé et la taille des variables dans le fichier. Je vais regarder l'article merci

  7. #7
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Il n’y a pas de magie :*sauf à faire des suppositions sur les données, tu ne peux pas deviner l’endianness si elle n’est pas indiquée explicitement ou invariable.

    Donc il faut regarder ce que génére le programme C# et vérifier si c’est toujours le cas indépendamment de l’architecture.

    Si le programme C# ne te génère pas toujours la même chose, en fonction de la machine sur laquelle il tourne, c’est lui qu’il faut corriger.

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    rôliste inside
    Dans nos boutiques de magie, nous aussi disposons d'un rayon informatique.
    On y trouve un jouet surprenant, le "nombre magique". Cet article étant connu et identifiable par sa position, il peut fournir des données indirectes très utiles.

    Fais écrire l'entier 1+2+4+16 = 23 comme en premier position du fichier.

    En lisant, soit tu trouve 23 et ton système est de même boutisme que l'autre, soit tu trouves 2^31 + 2^30 + 2^29 + 2^27 et tu es en opposition de boutisme.

  9. #9
    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,

    Si le format de ton fichier se doit d'être completement portable, il faut normalement écrire une spécification qui indique explicitement la forme et le boutisme utilisé pour l'écriture

    Le boutisme est relatif à l'ensemble du fichier, et, pour chaque donnée / structure enregistrer, il faut impérativement expliciter le type et la taille qu'elle représente dans dans le fichier (ne serait-ce que parce qu'il existe plusieurs tailles pour les char).

    Une fois ces spécifications définies, il s'agira de faire en sorte que tout programme sensé lire ou écrire ce format veille à les respecter.

    Pour ce qui concerne le boutisme utilisé, la décision peut etre purement arbitraire, mais il faut impérativement qu'elle soit explicite

    Mais ce n'est que comme cela que tu parviendras à ton objectif

    La bonne question à te poser est donc : plutôt que d'essayer de faire des déductions (peut être fausses par ailleurs) sur le contenu de ton fichier, est-ce qu'il existe une spécification du format utilisé

    Si oui, c'est vers le document qui la décrit qu'il faut te tourner (en nous demandant éventuellement de l'aide si tu ne comprends pas quelque chose), si non, c'est sur l'analyste technique qu'il faut frapper pour n'avoir fait son travail qu'à moitié
    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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Bonjour et merci pour vos réponses,

    J'ai eu le code C# et j'ai pu voir comment était écrit les données, il y a des fonctions BinaryWriter.ReadFloat, ... et tout est préciser dans la documentation MSDN sur le nombre d'octet qui est codés et sur l'endianess qui est codée aussi, (c'est du little -endian avec ces fonctions).

    Donc maintenant que je sais la taille des données du fichier binaire que je reçois, je vais faire un cas où
    - la machine B est en big endian et dans ce cas elle doit inverser tout les octets qu'elle lit.
    - la machine B est en little endian et dans ce cas elle n'a rien a faire d'autre que de lire les octets dans le sens de lecture car le fichier est supposé être codé en little endian

    Merci beaucoup pour votre aide, je posterai mon code car je pense que certains pourrat être intérésser.

    A bientot

    Algernon

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

Discussions similaires

  1. Lecture fichier binaire et inversion d'octets
    Par zoro_le_renard dans le forum Fortran
    Réponses: 8
    Dernier message: 17/07/2007, 20h35
  2. Lecture fichier binaire
    Par djidji dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2006, 11h58
  3. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  4. Lecture fichier binaire
    Par kek_net dans le forum Langage
    Réponses: 5
    Dernier message: 07/08/2006, 19h37
  5. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53

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