Преобразовать байтовый массив в класс, содержащий байтовый массив в C # - PullRequest
6 голосов
/ 03 мая 2010

У меня есть функция 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 ]

5 голосов
/ 03 мая 2010

Не нужен небезопасный код:

[StructLayout(LayoutKind.Sequential)]
public struct PacketFormat
{
  public byte header;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data;
}
4 голосов
/ 03 мая 2010

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

[StructLayout(LayoutKind.Sequential)]
public unsafe struct PacketFormat
{
  public byte header;
  public fixed byte data[256];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...