2010-05-02 7 views
6

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?

+0

Pouvez-vous utiliser un sérialiseur binaire/désérialiseur à la place? http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html –

+0

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

Répondre

5

Pas besoin de code non sécurisé:

[StructLayout(LayoutKind.Sequential)] 
public struct PacketFormat 
{ 
    public byte header; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] data; 
} 
+0

Merci, ça a marché! – Matt

4

Vous devez utiliser un tableau d'octets de taille fixe.

[StructLayout(LayoutKind.Sequential)] 
public unsafe struct PacketFormat 
{ 
    public byte header; 
    public fixed byte data[256]; 
} 
+0

Ma question était de savoir si cela pouvait être fait sans code dangereux. – Matt

Questions connexes