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 :

Différence entre deux OS pour lecture d'octets... bizarre


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut Différence entre deux OS pour lecture d'octets... bizarre
    Bonjour à tous,

    Dans mon petit projet, je lis en binaire un fichier 3ds (modele 3d pour utiliser ensuite avec opengl et glut).
    Je stocke chaque octet de ce fichier dans un vecteur de char puis je traite les données.
    Pour cela, je dois lire mes octets selon une trame donnée.
    Par exemple, je sais qu'à tel endroit je dois lire 2 octets et ce sera un short ou 4 octets et ce sera un int (type donné par la structure).

    Mon problème est que tout fonctionne sur Mac mais pas sur pc. Je m'explique :

    Dans ma structure, je peux lire ceci :
    - identifiant du noeud (2 octets)
    - taille totale du noeud (4 octets) : 2+4 + n pour les datas et sous noeuds.

    Donc grosso modo, je peux parcourir tout le fichier sans me préoccuper de quel noeud est quoi en faisant un deplacement comme ceci :
    lecture du premier noeud, je recupere la taille du fichier en tant que taille du noeud (logique, c'est le noeud pere et il n'y en a qu'un dans le fichier).

    Je me deplace de 6 octets pour arriver au sous noeud (le noeud pere n'a pas de data mais que des sous noeuds).
    Et là je parcoure tous les sous noeud du noeud pere en faisant une lecture de l'entete du noeud et en me deplacant de longueurDuNoeudFils à chaque fois.

    Tout cela fonctionne bien sur les deux machines. Sauf qu'à un moment, je ne sais pas pourquoi, sur pc ça merde à la lecture du noeud. Il me met un nombre hallucinant alors qu'avant il avait réussi à bien lire les longueurs des noeuds precedent.
    Ce nombre là est tres bien récupéré sous mac.
    Je pense à une différence de format de type ou autre depassement de je ne sais quoi, je ne sais pas... Pour etre franc, je n'ai aucune idée de ce qui pourrait poser probleme.

    Voici le source (épuré pour eviter le flood ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned long int readWord(vector<unsigned char>buff, int debut, int fin)
        { 
        unsigned long result = buff[debut]; 
           if(debut<fin)
               result = readWord(buff, debut+1, fin) * 0x100 + result;
        return result; 
        }
    Fonction servant à stocker les octets dans mes variables en s'occupant du probleme d'endianess.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    void lire(string filename)
         {
         ifstream fichier(filename.c_str());
         if (!fichier)
    		printf("erreur fichier \n");
    	else
            {
            long fsize = GetFileSize(fichier);
            unsigned char octet;
            unsigned long int octetsLus = 0;
            unsigned long int position = 0;
            vector<unsigned char> buffer;
            int i=0;
            while(i<fsize)
                 {
                 fichier.read(reinterpret_cast<char*>(&octet), 1);
                 buffer.push_back(octet);
                 i++;
                 }
            fichier.close();
            unsigned short id;
            unsigned int longueur;
            // lecture du noeud pere (2+4 octets)
            id = readWord(buffer, 0, 1);
            longueur = readWord(buffer, 2, 5);
            octetsLus=6;
            position = 6;
     
            if (id!=NOEUD3DS_MAIN)
               return;
     
            unsigned short ndid;
            unsigned long ndlongueur;
            printf("taille fichier : %d \n",longueur);
            while (octetsLus < longueur)
                  {
                  ndid = readWord(buffer, position, position+1);
                  ndlongueur = readWord(buffer, position+2, position+5);
                  position+=6;
     switch (ndid)
                         {
                         case NOEUD3DS_VERSION:
                             {
                             printf("NOEUD3DS_VERSION : longueur : %ld \n",ndlongueur);
                             position = position - 6 + ndlongueur;
                             octetsLus += ndlongueur;
                             break;
                             }
                         case NOEUD3DS_EDIT3DS:
                             {
                             printf("NOEUD3DS_EDIT3DS : longueur : %ld \n",ndlongueur);
                             octetsLus += 6;
                             break;
                             }
    default:
                             {
                             printf("defaut, %d \n",ndlongueur);
                             position = position - 6 + ndlongueur;
                             octetsLus += ndlongueur;
                             break;
                             }     
                         }
                  }
            printf("%d \n",octetsLus);
            }
         }
    Comme vous aurez pu le remarquer, certains noeuds ne comportent pas de données mais que des sous noeuds, donc je ne fais qu'avancer de 6 octets afin de passer au sous noeud.

    Voili voilou !
    Logiquement, il ne devrait pas y avoir de depassement, vu que je stocke dans des longs et que ma donnée de longueur fait 4 octets.(c'est ndlongueur qui pose probleme à un moment, au lieu d'avoir une valeur < taille du fichier, elle fait un nombre hallucinant)

    Je ne comprend pas.

    Merci d'avance
    ++

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    T'as oublié d'ouvrir ton fichier avec le flag std::ios_base::binary. Tu y avais pourtant pensé la première fois

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Lol
    Ah bah ouais forcement ca va marcher beaucoup moins bien ^^
    Merci beaucoup et vive l'etourderie !!!!!
    C'est dans des moments de solitude comme ça que j'aime les forums, t'as beau chercher, réinventer l'informatique dans tous les sens, tu capteras jamais que t'as oublié un petit truc de rien du tout

    Encore merci

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

Discussions similaires

  1. Fonction pour calculer la différence entre deux dates à base 360j
    Par messi1987 dans le forum Développement
    Réponses: 11
    Dernier message: 11/09/2018, 11h17
  2. Requete pour faire une différence entre deux dates
    Par PkoiTan2N dans le forum SQL
    Réponses: 2
    Dernier message: 28/04/2011, 13h14
  3. Réponses: 4
    Dernier message: 16/04/2008, 11h12
  4. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34
  5. Résultats erroné différence entre deux types TDateTime
    Par Alghero dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 17h03

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