J'ai une fonction C# qui convertit un tableau d'octets à une classe, étant donné son type:Convertir un tableau d'octets à une classe contenant un tableau d'octets en C#
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(data, 0, buffer, rawsize);
object result = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
J'utilise struct séquentielle:
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat { }
Cela a fonctionné correctement, jusqu'à ce que j'ai essayé de convertir en une structure/classe contenant un tableau d'octets.
[StructLayout(LayoutKind.Sequential)]
public new class PacketFormat : Packet.PacketFormat
{
public byte header;
public byte[] data = new byte[256];
}
Marshal.SizeOf(type)
retours 16, ce qui est trop faible (doit être 257) et provoque Marshal.PtrToStructure
à l'échec avec l'erreur suivante:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Je suppose que l'utilisation d'un réseau fixe serait une solution , mais peut-il aussi être fait sans avoir à recourir à un code dangereux?
Pouvez-vous utiliser un sérialiseur binaire/désérialiseur à la place? http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html –
Pouvez-vous donner un peu plus de contexte à ce que vous faites? Si possible, l'utilisation des classes de sérialisation intégrées vous épargnera beaucoup de maux de tête. – ChaosPandion