Ну, у вас здесь две задачи на самом деле. Во-первых, это, по сути, интерпретировать byte [] как struct, а во-вторых, иметь дело с возможным различным порядком байтов.
Итак, они несколько расходятся. AFAIK, если вы хотите использовать маршалинг - он будет просто интерпретировать байты, как если бы это была управляемая структура. Таким образом, преобразование из одного порядка в другой оставлено вам. Это не сложно сделать, но это не будет автоматически.
Итак, чтобы интерпретировать байт [] как структуру, вы должны иметь что-то вроде этого:
[StructLayout(LayoutKind.Sequential)]
internal struct X
{
public int IntValue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.U1)]
public byte[] Array;
}
static void Main(string[] args)
{
byte[] data = {1, 0, 0, 0, 9, 8, 7}; // IntValue = 1, Array = {9,8,7}
IntPtr ptPoit = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, ptPoit, data.Length);
var x = (X) Marshal.PtrToStructure(ptPoit, typeof (X));
Marshal.FreeHGlobal(ptPoit);
Console.WriteLine("x.IntValue = {0}", x.IntValue);
Console.WriteLine("x.Array = ({0}, {1}, {2})", x.Array[0], x.Array[1], x.Array[2]);
}
Итак, первые 4 байта переходят в IntValue (1,0,0,0) -> [little endian] -> 1
Следующие 3 байта идут непосредственно в массив.
Если вы хотите BigEndian, вы должны сделать это самостоятельно:
int LittleToBigEndian(int littleEndian)
{
byte[] buf = BitConverter.GetBytes(littleEndian).Reverse().ToArray();
return BitConverter.ToInt32(buf, 0);
}
Это немного беспорядочно, так что, вероятно, вам будет лучше придерживаться своего пользовательского парсера, который берет байты один за другим из исходного байта [] и заполнять ваш класс данных без StructLayout и другого встроенного взаимодействия.