2011-03-30 13 views
27

Bir delege sahip bir .dll (kendi değil) var. Bu temsilci Geri arama fonksiyonu:
"CallBackFN (ushort işlem kodu, ıntptr yük, uint boyutu, uint LocalIP)" C# nasıl Byte [] 'den IntPtr'ye dön

Nasıl ıntptr [] bayta dönüştürmek? Bence bu yük aslında Byte []. Eğer Byte değilse [] ve başka bir şey veri kaybeder mi?

+0

olası yinelenen: http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c –

cevap

5

this Stack Overflow question göre, yapabileceğiniz kullanabilirsiniz:

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

Downvoter'ın açıklamasını ister misiniz? –

33

Eğer 's byte:

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

o bayt değilse, Marsha boyut parametresi l.Copy, dizideki öğelerin sayısıdır, bayt boyutu değil. Dolayısıyla, bir bayt [] dizisinden ziyade bir int [] dizisi olsaydı, boyut parametresinin iletilen iletinin içinden geçtiğini varsayarak, kopyalanacak öğelerin doğru sayısını elde etmek için 4 (bayt başına bayt) olarak bölmeniz gerekirdi. bayttan. Eğer performansı gerekiyorsa

+0

Teşekkürler. Bence bu kadar. Dizi bayt değilse, cevabın ilk yarısı için "boyut" – Gabriel

+0

+ 1'i değiştirmeyi deneyeceğim. Gerçekten, diğer yarısı ... Okumadım bile :) – Bitterblue

12

, doğrudan kullanın:

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); 
     } 
    } 
}