У меня есть функция 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
со следующей ошибкой:
Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
Я предполагаю, что использование фиксированного массива было бы решением, но можно ли это сделать без необходимости прибегать к небезопасному коду?