Salut,
J'ai un probl�me �trange avec Marshal.SizeOf...
Je souhaite manipuler la structure native suivante (en-t�te d'un fichier bitmap) :
Code C : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7 typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
J'ai donc �crit l'�quivalent en C# :
Le layout explicite est n�cessaire pour que le marshalling n'aligne pas les champs sur les bornes de 32bits (�a d�calerait tous les champs � partir du 2e, ce qui corromprait l'en-t�te).
Code C# : 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 [StructLayout(LayoutKind.Explicit)] private struct BITMAPFILEHEADER { public static readonly short BM = 0x4d42; // BM [FieldOffset(0)] public short bfType; [FieldOffset(2)] public int bfSize; [FieldOffset(6)] public short bfReserved1; [FieldOffset(8)] public short bfReserved2; [FieldOffset(10)] public int bfOffBits; }
Quand je copie cette structure vers la m�moire non-manag�e avec Marshal.Copy, le layout explicite est bien pris en compte et les donn�es binaires sont correctes.
Par contre, Marshal.SizeOf me renvoie 16
Pourtant, j'ai beau compter et recompter, �a fait 14... d'ailleurs si j'�cris 16 octets d'en-t�te, le fichier est incorrect et illisible. Si je ne tiens pas compte de ce que dit Marshal.Sizeof et que j'utilise une taille de 14, �a fonctionne nickel.
En fait, on dirait qu'il ne tient pas compte du layout explicite dans le calcul de la tailleJ'ai aussi essay� avec l'op�rateur sizeof (dans un bloc unsafe), le r�sultat est le m�me.
Bref, je ne trouve aucun moyen d'obtenir une taille correcte autrement qu'en la codant en dur. Quelqu'un aurait une id�e de comment faire ? Ou une explication de ce comportement ?
Partager