Преобразование массива байтов в класс, содержащий массив байтов в 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];
}