IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Marshal.SizeOf avec layout explicite renvoie une taille fausse ?!


Sujet :

C++/CLI

  1. #1
    R�dacteur/Mod�rateur


    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    F�vrier 2004
    Messages
    19 875
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 19 875
    Par d�faut Marshal.SizeOf avec layout explicite renvoie une taille fausse ?!
    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# :
    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;
            }
    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).

    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 taille J'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 ?

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    F�vrier 2004
    Messages
    19 875
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 19 875
    Par d�faut
    Hum... bon, apparemment il suffisait que j'�nonce clairement le probl�me pour trouver la solution... j'y ai pens� en �crivant le post, j'ai essay� juste apr�s, et c'�tait �a. Comme quoi j'aurais du tester avant de poster

    Il suffisait d'ajouter dans l'attribut StructLayout le param�tre Pack = 2 :
    Code C# : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
            [StructLayout(LayoutKind.Explicit, Pack = 2)]
            private struct BITMAPFILEHEADER


    Pour info, l'objectif est d'effectuer le d�codage d'un DIB (DeviceIndependentBitmap) r�cup�r� du presse-papiers, pour contourner un bug de la classe Clipboard de WPF. Maintenant que ce probl�me est r�gl�, tout marche, je posterai le code d'ici peu...

    EDIT: avec Pack = 2, plus besoin du layout explicite, le s�quentiel marche nickel... donc on peut faire sauter tous les FieldOffset

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Nagios check_total_procs renvoie une r�ponse fausse via NRPE
    Par pausg dans le forum Administration syst�me
    R�ponses: 0
    Dernier message: 27/09/2011, 11h30
  2. Calendar.getInstance() renvoie une date fausse
    Par Phonatacid dans le forum Collection et Stream
    R�ponses: 2
    Dernier message: 26/05/2009, 12h40
  3. sauter une ligne avec Layout...
    Par youp_db dans le forum Agents de placement/Fen�tres
    R�ponses: 3
    Dernier message: 16/12/2005, 19h54
  4. R�ponses: 5
    Dernier message: 28/11/2005, 17h20
  5. Bloquer une taille de CView avec OnSize
    Par vanitom dans le forum MFC
    R�ponses: 3
    Dernier message: 17/11/2005, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo