Bonjour,
Je tente de lire le header d'un fichier bitmap. J'y arrive en utilisant fread pour chacun des champs de ma structure BMPHeader 1 par 1, mais lorsque je veux lire l'ensemble de mon header en faisant un fread global, je n'obtiens que des valeurs incorrectes.
Comme la struct de mon header contient des "short int", j'intuite que mes données sont mal remplies à cause d'un probleme d'arrondi en int des tailles de structs ?
J'ai entendu rapidement parler de padding, d'alignement, est ce qu'il s'agit du problème auquel je suis confronté ? Quelqu'un pourrait il me pointer une documentation (plus) claire (que wikipédia), idéalement avec un schéma, si c'est ce problème afin que je comprenne bien de quoi il s'agit ?
Voici mon source :
Mon header de BMP :
Remplit des valeurs correctes, mais est pénible et pas propre au niveau du code car oblige à faire 20 freads d'affilée :
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 typedef struct { unsigned short int magicid; unsigned int fileSize; unsigned short int reserved1, reserved2; unsigned int offset; unsigned int headerSize; int width; int height; unsigned short int planes; unsigned short int bits; unsigned int compression; unsigned int imagesize; int xresolution,yresolution; unsigned int ncolours; unsigned int importantcolours; } BMPHeader;
Remplit des valeurs incorrecte dans ma struct :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if (fread(&header.magicid,sizeof(short int),1,fptr) != 1) { fprintf(stderr,"Failed to read BMP magic header\n"); exit(-1); } fprintf(stderr,"ID is: %d, should be %d\n",header.magicid,'M'*256+'B'); fread(&header.fileSize,sizeof(int),1,fptr); fprintf(stderr,"File size is %d bytes\n",header.fileSize);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 long readsize = fread(&header,sizeof(BMPHeader),1,fptr); fprintf(stderr,"Read size : %d", readsize); if ( tailelue != 1) { fprintf(stderr,"Failed to read BMP info header\n"); exit(-1); }
Partager