Преобразование массива байтов в класс, содержащий массив байтов в C#

у меня есть функция 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 сбой со следующей ошибкой:

попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Я предполагаю, что использование фиксированного массива было бы решением, но можно ли это сделать без использования небезопасного кода?

2 ответов


нет необходимости в небезопасном коде:

[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];
}