1

I am parsing packet using marshalling and following is my code

public class test_parsing
{

// TCP header packet
[StructLayout(LayoutKind.Explicit)]
struct COMP_PKT
{
    [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
    public byte[] servername;

    [FieldOffset(12), MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
    public byte[] serverpasswd;

    [FieldOffset(24), MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] imei_tac;

    [FieldOffset(28), MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] imei_msn;

    [FieldOffset(31), MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public byte[] seq_number;
};

static private COMP_PKT fromByte(byte[] arr)
{
    COMP_PKT str = new COMP_PKT();
    GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
    str = (COMP_PKT)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(COMP_PKT));
    handle.Free();
    return str;
}

static private void Datapackparser(byte[] packet, int size, int indexno)
{
    COMP_PKT comp_pkt_data = fromByte(packet);


  char p = Convert.ToChar(packet[index+1]);
    Console.WriteLine();
    Console.WriteLine(Encoding.ASCII.GetString(comp_pkt_data.servername));
    Console.WriteLine(Encoding.ASCII.GetString(comp_pkt_data.serverpasswd));
    Console.WriteLine(Encoding.ASCII.GetString(comp_pkt_data.imei_tac));
    Console.WriteLine(Encoding.ASCII.GetString(comp_pkt_data.imei_msn));
  Console.ReadKey();
}


public static void Main()
{

    byte[] temp = new byte[] { 112, 114, 97, 116, 121, 117, 115, 104, 0, 0, 0, 0, 112, 114, 97, 116, 101, 101, 107, 0, 0, 0, 0, 0, 49, 50, 51, 52, 49, 50, 51, 53, 54, 57, 57, 57, 57, 57 };
    Datapackparser(temp, 1, 2);
}

}

Problem I am facing is that if I keep SizeConst even number for imei_msn then parsing is done correctly but if I keep SizeConst odd number for imei_msn then following error is shown "Could not load type 'COMP_PKT' from assembly 'test_paktparsing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' because it contains an object field at offset 31 that is incorrectly aligned or overlapped by a non-object field."

Also if I am parsing till only imei_msn then SizeConst even or odd doesn't matter as parsing is done correctly. So where I am making mistake?

prattom
  • 1,625
  • 11
  • 42
  • 67

0 Answers0