Marshal.SizeOf structure returns excessive number

后端 未结 2 1950
囚心锁ツ
囚心锁ツ 2021-01-18 21:02

I have the following structure

[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
    pu         


        
相关标签:
2条回答
  • 2021-01-18 21:34

    You could use a fixed size buffer instead of a string.

    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct SFHeader
    {
        public fixed char FileName[5];
        public int Offset;
        public short Size;
        public byte Flags;
        public byte Source;
        public long LastWriteTime;
    
        public byte[] GetBytes()
        {
            //omitted
        }
    
        public static SFHeader FromBytes(byte[] buffer)
        {
            //omitted
        }
    }
    
    0 讨论(0)
  • 2021-01-18 21:44

    You're running into a byte-alignment issue. In an attempt to keep fields on word boundaries for speed of access, the compiler is padding your string with 3 extra bytes. To fix this, use the Pack field of the StructLayoutAttribute.

    [StructLayout(LayoutKind.Sequential, Pack=1)]  // notice the packing here
    public struct SFHeader
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string FileName;
    
        public int Offset;
    
        public short Size;
    
        public byte Flags;
    
        public byte Source;
    
        public long LastWriteTime;
    }
    
    0 讨论(0)
提交回复
热议问题