Pages vues depuis 25/07/2007 : 25 168 254
Index du forum »» Création-Développement »» Ecriture - lecture fichier sur plateformes différentes
Pour être clair il y a deux sens d' "ordering" à la motorola ou à l'intel
Donc si tu lis ou écris une fichier d'un format donné il faut suivre la spec du format pour son ordering (Idem si tu créée un format = faut se décider)
Par exemple pour IFF c'est motorola
FB->FileByteOrder='M';
Après on peut auto détecter l'ordering de ta machine
WORD One=1;
UBYTE *TestOrder=(UBYTE *)&One;
if(TestOrder[1]==1)
{FB->ComputerByteOrder='M';}
else
{FB->ComputerByteOrder='I';}
Et on réordonne si besoin
FB->Reorder=(FB->ComputerByteOrder!=FB->FileByteOrder)
/*==========================================================================*/
UBYTE GetByte(FileBuffer3D *FB)
{
UBYTE val;
val=FB->pt[0];
GetSkip(FB,1);
return(val);
}
/*==========================================================================*/
UWORD GetWord(FileBuffer3D *FB)
{
UBYTE vals[2];
UWORD *pt=(UWORD*)vals;
if(!FB->Reorder)
{
vals[0]=FB->pt[0];
vals[1]=FB->pt[1];
}
else
{
vals[0]=FB->pt[1];
vals[1]=FB->pt[0];
}
GetSkip(FB,2);
return(*pt);
}
/*==========================================================================*/
ULONG GetLong(FileBuffer3D *FB)
{
UBYTE vals[4];
ULONG *pt=(ULONG*)vals;
if(!FB->Reorder)
{
vals[0]=FB->pt[0];
vals[1]=FB->pt[1];
vals[2]=FB->pt[2];
vals[3]=FB->pt[3];
}
else
{
vals[0]=FB->pt[3];
vals[1]=FB->pt[2];
vals[2]=FB->pt[1];
vals[3]=FB->pt[0];
}
GetSkip(FB,4);
return(*pt);
}
/*==========================================================================*/
float GetFloat(FileBuffer3D *FB)
{
UBYTE vals[4];
float *pt=(float*)vals;
if(!FB->Reorder)
{
vals[0]=FB->pt[0];
vals[1]=FB->pt[1];
vals[2]=FB->pt[2];
vals[3]=FB->pt[3];
}
else
{
vals[0]=FB->pt[3];
vals[1]=FB->pt[2];
vals[2]=FB->pt[1];
vals[3]=FB->pt[0];
}
GetSkip(FB,4);
return(*pt);
}
/*==========================================================================*/
void GetSkip(FileBuffer3D *FB,LONG n)
{
FB->pos= FB->pos + n;
FB->pt = FB->pt + n;
}
/*==========================================================================*/
Exactement comme le dis Corto tu dois lire ton fichier donnée par donnée et non pas une struct entiére sinon tu risque des problèmes
cad que si ta struct est ainsi dans ton fichier
struct toto{
ULONG x;
WORD n;
UBYTE flag;
};
struct toto T;
Il faut faire
T.x =GetLong(FB);
T.n =GetWord(FB);
T.flag =GetByte(FB);
Au préalable j'ai chargé tout le fichier en mémoire dans un buffer et FB est ma structure qui me dit ou j'en suis de sa lecture
>Juste un point, sur ARM, l'ordre des octets est-il similaires à Intel ou Motorola ?
Qu'importe utilise le code ci dessus qui detecte mon ComputerByteOrder et ça marche à tout les coups
Alain
PS:
sur l'alignement des struct il existe des directives pour s'en passer comme
#pragma pack(2)
voir la doc des compilo
On peut aussi rajouter du "padding" aux structs perso pour les aligner de force à 32 bits
struct toto{
ULONG x;
WORD n,pad;
UBYTE flag,pad1,pad2,pad3;
};
Mais de toute façon lire des struct entiére dans le fichier est une mauvaise idée car il faudra réordonner les valeurs quand même donc les relire/écrire