Hvordan Marshal jeg en rekke bytes til en struct?

stemmer
0

Relatert Spørsmål

I beslektet spørsmål, jeg prøver å finne ut den raskeste måten. Metoden jeg valgte i det spørsmålet er blitt en flaskehals for meg. Jeg leser noen binære data fra en fil og trenger å sette det inn i en styrt struktur definisjon. Ingen uovervåkede kode er involvert så jeg tenker det er en bedre måte enn å fordele GCHandle.

Er det en måte å bare kaste en rekke bytes til en struktur av samme størrelse?

Publisert på 21/07/2009 klokken 15:00
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Du kan sjekke ut en slik kode:


struct Foo
{
  public int x;
}

public unsafe static void Main()
{
  byte[] x = new byte[] { 1, 1, 0, 0 };
  Foo f;

  fixed (byte* xPtr = x)
  {
    f = *((Fpp*)xPtr);
  }

  Console.WriteLine(f.x);
}

Det er definitivt veldig usikre, annonsen du kunne ha problemer hvis strukturen inneholder noen mer komplekse typer.

Svarte 21/07/2009 kl. 15:14
kilden bruker

stemmer
0

Jeg har en metode som dette:

static public T ReadStructure<T>(byte[] bytes)
    where T : struct
{
    int len = Marshal.SizeOf(typeof(T));
    IntPtr i = Marshal.AllocHGlobal(len);

    try
    {
        Marshal.Copy(bytes, 0, i, len);
        return (T)Marshal.PtrToStructure(i, typeof(T));
    }
    finally
    {
        Marshal.FreeHGlobal(i);
    }
}

Riktignok er det ikke veldig fort - men det trenger ikke å være, i mitt tilfelle. Er dette din nåværende løsning, og du finner at Alloc / kopi / release overhead er for treg?

Svarte 21/07/2009 kl. 15:14
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more