2011-03-30 21 views
27

我有一個.dll(不是我自己的)有一個委託。此委託回調函數:
「CallBackFN(USHORT操作碼,IntPtr的有效載荷,UINT大小,UINT localIP)」C#如何從IntPtr得到Byte []

我怎麼能轉換的IntPtr爲byte []?我認爲有效載荷實際上是Byte []。如果它不是Byte [],那麼它會丟失一些數據?

+0

可能重複:http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c – 2011-03-30 13:44:36

回答

5

this Stack Overflow question,你可以做到以下幾點:

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

downvoter照顧解釋? – 2016-06-03 18:48:54

33

如果它的字節:

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

如果不是字節, Marsha中的大小參數l.Copy是數組中元素的個數,而不是字節大小。所以,如果你有一個int []數組而不是byte []數組,你必須除以4(每個int的字節數)才能得到正確數量的元素來複制,假設你的size參數通過回調傳遞字節數。

+0

謝謝。我覺得這就是。如果數組不是字節,那麼我會嘗試在答案的前半部分更改「大小」 – Gabriel 2011-03-30 13:42:23

+0

+1。真的,另一半不......我甚至沒有讀過它:) – Bitterblue 2014-07-10 11:47:38

12

如果您需要的性能,直接使用它:

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