2011-03-30 9 views
27

Mam .dll (nie mój własny), który ma delegata. Ta funkcja zwrotna jest delegat:
"CallBackFN (ushort OPCODE, IntPtr ładowność, rozmiar uint, uint localIP)"C# jak zdobyć Byte [] od IntPtr

jaki sposób można przekonwertować IntPtr do byte []? Myślę, że ładunek jest rzeczywiście Byte []. Jeśli nie jest Byte [] i jest coś innego, czy straciłbym jakieś dane?

+0

możliwe duplikat: http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c –

Odpowiedz

5

Według this Stack Overflow question, można wykonać następujące czynności:

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize); 
+0

Czy osoba zainteresowana mogłaby wyjaśnić? –

33

Jeśli to bajty:

byte[] managedArray = new byte[size]; 
Marshal.Copy(pnt, managedArray, 0, size); 

Jeśli nie bajtów parametr wielkości Marsha l.Copy to liczba elementów w tablicy, a nie rozmiar bajtu. Tak więc, gdybyś miał tablicę int [], a nie tablicę byte [], musiałbyś podzielić przez 4 (bajty na int), aby uzyskać poprawną liczbę elementów do skopiowania, zakładając, że twój parametr wielkości przekazywany przez wywołanie zwrotne odnosi się do # bajtów.

+0

Dzięki. Myślę, że to jest to. Jeśli tablica nie jest bajtem, spróbuję zmienić "rozmiar" – Gabriel

+0

+1 dla pierwszej połowy odpowiedzi. Naprawdę, druga połowa nie ... Nawet nie przeczytałem :) – Bitterblue

12

Jeśli potrzebujesz wydajności, użyj go bezpośrednio:

unsafe { 
    byte *ptr = (byte *)buffer.ToPointer(); 

    int offset = 0; 
    for (int i=0; i<height; i++) 
    { 
     for (int j=0; j<width; j++) 
     { 

      float b = (float)ptr[offset+0]/255.0f; 
      float g = (float)ptr[offset+1]/255.0f; 
      float r = (float)ptr[offset+2]/255.0f; 
      float a = (float)ptr[offset+3]/255.0f; 
      offset += 4; 

      UnityEngine.Color color = new UnityEngine.Color(r, g, b, a); 
      texture.SetPixel(j, height-i, color); 
     } 
    } 
}