This is done using
System.Runtime.InteropServices
and explicit structure layout with attributes specifying offset for each field explicitly.
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct BytePart {
[FieldOffset(0)]
public byte B1;
[FieldOffset(1)]
public byte B2;
[FieldOffset(2)]
public byte B3;
[FieldOffset(3)]
public byte B4;
}
[StructLayout(LayoutKind.Explicit)]
struct ShortPart {
[FieldOffset(0)]
public ushort W1;
[FieldOffset(2)]
public ushort W2;
}
[StructLayout(LayoutKind.Explicit)]
struct InAddress {
[FieldOffset(0)]
public BytePart BytePart;
[FieldOffset(0)]
public ShortPart ShortPart;
[FieldOffset(0)]
ulong Address;
}
This is a fully equivalent definition without nested structures:
[StructLayout(LayoutKind.Explicit)]
struct InAddress {
[FieldOffset(0)]
public byte B1;
[FieldOffset(1)]
public byte B2;
[FieldOffset(2)]
public byte B3;
[FieldOffset(3)]
public byte B4;
[FieldOffset(0)]
public ushort W1;
[FieldOffset(2)]
public ushort W2;
[FieldOffset(0)]
ulong Address;
}
See:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx[
^],
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.fieldoffsetattribute.aspx[
^].
—SA