I have the following structure
[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
pu
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
}
}
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;
}