Преобразуйте массив байтов в класс, содержащий массив байтов в 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 перестать работать со следующей ошибкой:

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

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

6
задан ChaosPandion 2 May 2010 в 23:31
поделиться

2 ответа

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

[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
  public byte header;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}
5
ответ дан 10 December 2019 в 02:43
поделиться

Вам необходимо использовать массив байтов фиксированного размера.

[StructLayout(LayoutKind.Sequential)]
public unsafe struct PacketFormat
{
  public byte header;
  public fixed byte data[256];
}
4
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: