Bonjour,
j'essai de lire le header d'un fichier bitmap, et d'en extraire les informations.
Mon programme doit-être portable sur différentes machines, donc j'ai déclaré quelques types à ma façon :
typedef unsigned int BOOL; /* 1-Bit. */
typedef signed char S8; /* 8-Bit Signed. */
typedef unsigned char U8; /* 8-Bit Unsigned. */
typedef signed short S16; /* 16-Bit Signed. */
typedef unsigned short U16; /* 16-Bit Unsigned. */
typedef signed long S32; /* 32-Bit Signed. */
typedef unsigned long U32; /* 32-Bit Unsigned. */
Comme ça, si j'ai bien compris, la taille en octet d'un type ne dépendra plus de la machine.
Ensuite, j'ai déclaré une structure, dont le but est de contenir les informations :
/* Structure d'un en-tête de fichier bitmap */
typedef struct t_bmpHeader{
U8 u8_signature[2];
U32 u32_tailleFichierOct;
U32 u32_reserved;
U32 u32_offset;
U32 u32_tailleBmpInfo;
U32 u32_largeurImagePxl;
U32 u32_hauteurImagePxl;
U16 u16_nbrePlans,
U16 u16_bitsParPixels;
U32 u32_compressionImage;
U32 u32_tailleImageOct;
U32 u32_resolutionX;
U32 u32_resolutionY;
U32 u32_nombreCouleurs;
U32 u32_nombreIndexCouleurs;
}t_bmpHeader;
Enfin, j'ai enregistré le header de mon image :
FILE* pf_bmp;
t_bmpHeader t_headerFile;
pf_bmp = fopen("bitmap.bmp", "rb");
fread(&t_headerFile, 1, sizeof(t_headerFile), pf_bmp);
Et enfin j'essai d'afficher les informations :
printf("signature: %c%c \n", t_str->u8_signature[0], t_headerFile.u8_signature[1]);
printf("taille du fichier en octet: %li \n", t_headerFile.u32_tailleFichierOct);
printf("offset: %li \n", t_headerFile.u32_offset);
...
Mais voilà, ça ne marche pas. Les valeurs obtenus sont fausses, à part pour la signature qui est correcte (BM).
Je me demandais si le problème ne pouvait pas venir de la façon dont sont enregistrées les valeurs (Little endien, big endien...).
En changeant les U32 par des tableaux de U8, ça fonctionne parfaitement. Exemple :
U32 u32_tailleFichierOct; est remplacé par U8 u8_tailleFichierOct[4];
on affiche en écrivant : printf("taille du fichier en octet: %li \n", *(t_headerFile.u8_tailleFichierOct));
J'aimerais bien comprendre quel est le problème, car il me semblerait plus logique d'utiliser directement U32 au lieu d'un tableau de U8.
Merci d'avance pour vos idées...
Glipper