C # Marshal массив для структурирования - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать Marshal для копирования массива в структуру:

[StructLayout(LayoutKind.Sequential, Pack = 1,Size = 14)]
public struct RDShifterGearDecrease
{
    [MarshalAs(UnmanagedType.U4,SizeConst =4)]
    public UInt32 PosReduceGear;
    [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
    public UInt32 PosReturnCenter;
    [MarshalAs(UnmanagedType.U2, SizeConst = 2)]
    public UInt16 BlipTimeBeforeDecreaseGear;
    [MarshalAs(UnmanagedType.U2, SizeConst = 2)]
    public UInt16 TimeoutGearDecrease;
    [MarshalAs(UnmanagedType.U2, SizeConst = 2)]
    public UInt16 TimeoutReturnCenter;
}

Мой массив:

[0]=0;
[1]=1;
[2]=5;
[3]=4;
...
[13]=0;

Метод, который я использую для копирования:

 private static T FillObjectWithData<T>(byte[] arr)
 {
      T str = default(T);
       try
       {
           int size = Marshal.SizeOf(str);
           IntPtr ptr = Marshal.AllocHGlobal(size);
           Marshal.Copy(arr, 0, ptr, size);
           str = (T)Marshal.PtrToStructure(ptr, str.GetType());
           Marshal.FreeHGlobal(ptr);
       }
       catch (Exception e)
       {
       }
       return str;
 }

Например, значение первой переменной PosReduceGear мне бы хотелось 0x0154 = 340, но оно мне дало 0x04050100 = 67436800.

Я понимаю, почему, и хотел бы избежать манипулирования массивом перед копированием. В структуре есть что-то, что я могу сделать?

...