У меня есть структура, определяемая как:
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi,Pack = 1)]
internal struct Message
{
[MarshalAs(UnmanagedType.U1, SizeConst = 1)]
public byte age;
[MarshalAs(UnmanagedType.U2, SizeConst = 2)]
public ushort length;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,SizeConst = 502)]
public byte[] data;
}
полезная нагрузка, полученная через udp , при получении байта [], должна быть преобразована в структуру.data
длина указана как 502
, но на самом деле это должно быть значение элемента length
, указывающее длину данных. Если удалить атрибут SizeConst
, код выдаст исключение Marshal
в Marshal.SizeOf(typeof(T))
.
public static T ToStruct<T>(this byte[] buf)
{
var lth = Marshal.SizeOf(typeof(T));
if (lth > buf.Length) return default(T);
var ptr = Marshal.AllocHGlobal(lth);
Marshal.Copy(buf, 0, ptr, lth);
var structure = Marshal.PtrToStructure(ptr, typeof(T));
Marshal.FreeHGlobal(ptr);
return (T)structure;
}
информация об исключении:
System.ArgumentException
: тип 'Itms.Agent.IotBox.TieTa.Entity.Message' нельзя маршалировать как неуправляемую структуру;Никакой значимый размер или смещение не могут быть вычислены.
я знаю, что это очень просто обрабатывать в c / c ++, но C # не имеет подобного подхода.любая помощь?