2010-05-02 31 views
6

Tengo una función de C# que convierte una matriz de bytes a una clase, teniendo en cuenta su tipo:Convertir una matriz de bytes a una clase que contiene una matriz de bytes en C#

IntPtr buffer = Marshal.AllocHGlobal(rawsize); 
Marshal.Copy(data, 0, buffer, rawsize); 
object result = Marshal.PtrToStructure(buffer, type); 
Marshal.FreeHGlobal(buffer); 

utilizo estructuras secuenciales:

[StructLayout(LayoutKind.Sequential)] 
public new class PacketFormat : Packet.PacketFormat { } 

Esto funcionó bien, hasta que traté de convertir a una estructura/clase que contiene una matriz de bytes.

[StructLayout(LayoutKind.Sequential)] 
public new class PacketFormat : Packet.PacketFormat 
{ 
    public byte header; 
    public byte[] data = new byte[256]; 
} 

Marshal.SizeOf(type) retornos 16, que es demasiado bajo (debe ser 257) y hace que Marshal.PtrToStructure a fallar con el error siguiente:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

supongo que el uso de una matriz fija sería una solución , pero ¿también se puede hacer sin tener que recurrir a un código inseguro?

+0

Podría utilizar un serializador binario/deserializer en su lugar? http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html –

+0

¿Puedes darnos un poco más de información sobre lo que estás haciendo? Si es posible, usar las clases de serialización integradas le ahorrará muchos dolores de cabeza. – ChaosPandion

Respuesta

5

No hay necesidad de código no seguro:

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

¡Gracias, eso funcionó! – Matt

4

Necesita utilizar una matriz de bytes de tamaño fijo.

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

Mi pregunta era si se podría hacer sin un código inseguro. – Matt

Cuestiones relacionadas