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