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 ) :
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 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; }
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.
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); } }
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
++
Partager