title: structs using FieldOffset unexpected behaviour
body: <p>I am trying to understand explicit struct layout and struct overlaying and i am not seeing behaviour i expect.  Given the code below:</p>
  
  <pre><code>class Program
  {
  
      static void Main(string[] args)
      {
          byte[] bytes = new byte[17];
          bytes[0] = 0x01; // Age is 1    //IntField1
          bytes[1] = 0x00;                //IntField1
          bytes[2] = 0x00;                //IntField1
          bytes[3] = 0x00;                //IntField1
          bytes[4] = 0x02;                //IntField2
          bytes[5] = 0x00;                //IntField2
          bytes[6] = 0x00;                //IntField2
          bytes[7] = 0x00;                //IntField2
  
          bytes[8] = 0x41;                //CharArray A
          bytes[9] = 0x42;                //CharArray B
          bytes[10] = 0x43;               //CharArray C
          bytes[11] = 0x44;               //CharArray D
  
          bytes[12] = 0x45;               //CharArray E
  
          bytes[13] = 0x46;               //CharArray F
          bytes[14] = 0x00; // \0 decimal 0
          bytes[15] = 0x00; // \0 decimal 0
          bytes[16] = 0x01; // 1 decimal 1
          Console.WriteLine(Marshal.SizeOf(typeof(TestStruct)));
  
          TestStruct testStruct2 = (TestStruct) RawDeserialize(bytes, 0, typeof (TestStruct));
  
          Console.WriteLine(testStruct2);
          Console.ReadLine();
      }
      public static object RawDeserialize( byte[] rawData, int position, Type anyType )
      {
          int rawsize = Marshal.SizeOf( anyType );
          if( rawsize &gt; rawData.Length )
              return null;
  
          IntPtr buffer = Marshal.AllocHGlobal( rawsize );
          Marshal.Copy( rawData, position, buffer, rawsize );
          object retobj = Marshal.PtrToStructure( buffer, anyType );
          Marshal.FreeHGlobal( buffer );
          return retobj;
      }
  }
  
  [StructLayout(LayoutKind.Explicit, Pack = 1)]
  public struct TestStruct
  {
      [FieldOffset(0)]
      public int IntField1;
      [FieldOffset(4)]
      public int IntField2;
      [FieldOffset(8)]
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
      public char[] CharArray;
      [FieldOffset(16)]
      public byte SomeByte;        
  
      [FieldOffset(8)]
      public TestStruct2 SubStruct;
  
      public override string ToString()
      {
          return string.Format("IntField1: {0}\nIntField2: {1}\nCharArray: {2}\nSomeByte: {3}\nSubStruct:\n{{{4}}}", 
              IntField1, IntField2,  new string(CharArray), SomeByte, SubStruct);
      }
  }
  
  [StructLayout(LayoutKind.Explicit, Pack = 1)]
  public struct TestStruct2
  {
      [FieldOffset(0)]
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
      public char[] CharArray1;
      [FieldOffset(0)]
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
      public char[] CharArray2;
      [FieldOffset(4)]
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
      public char[] CharArray3;
  
      public override string ToString()
      {
          return string.Format("CharArray1: {0}\nCharArray2: {1}\nCharArray3: {2}",
             new string(CharArray1), new string(CharArray2), new string(CharArray3));
      }
  }
  </code></pre>
  
  <p>I would expect the result from this to be something like:</p>
  
  <blockquote>
    <p>IntField1: 1<br>
    IntField2: 2<br>
    CharArray: ABCDEF<br>
    SomeByte: 1<br>
    SubStruct:<br>
    {CharArray1: ABCDEF<br>
    CharArray2: ABCD<br>
    CharArray3: E }  </p>
  </blockquote>
  
  <p>but the result is:</p>
  
  <blockquote>
    <p>IntField1: 1<br>
    IntField2: 2<br>
    CharArray: ABCD<br>
    SomeByte: 1<br>
    SubStruct:<br>
    {CharArray1: ABCD<br>
    CharArray2: ABCD<br>
    CharArray3: EF}  </p>
  </blockquote>
  
  <p>Why does the CharArray in the TestStruct have a length of 4? I epxected it to have 6 characters ABCDEF but it only contains ABCD. Same for the TestStruct2.CharArray1.</p>