2010-05-02 3 views
6

Ho una funzione di C# che converte un array di byte a una classe, dato del tipo:Convertire un array di byte a una classe che contiene un array di byte in C#

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

io uso le strutture sequenziali:

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

Questo ha funzionato bene, fino a quando non ho provato a convertire in una struct/class contenente un array di byte.

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

Marshal.SizeOf(type) rendimenti 16, che è troppo bassa (dovrebbero essere 257) e provoca Marshal.PtrToStructure per riuscire con il seguente errore:

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

Sto indovinando che utilizza una matrice fissa sarebbe una soluzione , ma può anche essere fatto senza dover ricorrere a codice non sicuro?

+0

Hai bisogno di un serializzatore binario/deserializzatore, invece? http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html –

+0

Puoi dare un po 'più di fondo a quello che stai facendo? Se possibile, usare le classi di serializzazione integrate ti farà risparmiare un sacco di mal di testa. – ChaosPandion

risposta

5

Non c'è bisogno di codice non sicuro:

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

Grazie, ha funzionato! – Matt

4

È necessario utilizzare un array di byte di dimensioni fisse.

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

La mia domanda era se poteva essere fatto senza codice non sicuro. – Matt