У меня есть функция C#, которая преобразовывает массив байтов в класс, учитывая он - тип:
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(data, 0, buffer, rawsize);
object result = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
Я использую последовательные структуры:
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat { }
Это хорошо работало, пока я не пытался преобразовать в структуру/класс, содержащую массив байтов.
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat
{
public byte header;
public byte[] data = new byte[256];
}
Marshal.SizeOf(type)
возвраты 16, который является слишком низким (должен быть 257), и причины Marshal.PtrToStructure
перестать работать со следующей ошибкой:
Предпринятый для чтения или защищенная от записи память. Это часто - признак, что другая память повреждена.
Я предполагаю, что использование фиксированного массива было бы решением, но оно может также обойтись без необходимость обратиться к небезопасному коду?
Нет необходимости в небезопасном коде:
[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
public byte header;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}
Вам необходимо использовать массив байтов фиксированного размера.
[StructLayout(LayoutKind.Sequential)]
public unsafe struct PacketFormat
{
public byte header;
public fixed byte data[256];
}