我有一個.dll(不是我自己的)有一個委託。此委託回調函數:
「CallBackFN(USHORT操作碼,IntPtr的有效載荷,UINT大小,UINT localIP)」C#如何從IntPtr得到Byte []
我怎麼能轉換的IntPtr爲byte []?我認爲有效載荷實際上是Byte []。如果它不是Byte [],那麼它會丟失一些數據?
我有一個.dll(不是我自己的)有一個委託。此委託回調函數:
「CallBackFN(USHORT操作碼,IntPtr的有效載荷,UINT大小,UINT localIP)」C#如何從IntPtr得到Byte []
我怎麼能轉換的IntPtr爲byte []?我認爲有效載荷實際上是Byte []。如果它不是Byte [],那麼它會丟失一些數據?
據this Stack Overflow question,你可以做到以下幾點:
var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
downvoter照顧解釋? – 2016-06-03 18:48:54
如果它的字節:
byte[] managedArray = new byte[size];
Marshal.Copy(pnt, managedArray, 0, size);
如果不是字節, Marsha中的大小參數l.Copy是數組中元素的個數,而不是字節大小。所以,如果你有一個int []數組而不是byte []數組,你必須除以4(每個int的字節數)才能得到正確數量的元素來複制,假設你的size參數通過回調傳遞字節數。
謝謝。我覺得這就是。如果數組不是字節,那麼我會嘗試在答案的前半部分更改「大小」 – Gabriel 2011-03-30 13:42:23
+1。真的,另一半不......我甚至沒有讀過它:) – Bitterblue 2014-07-10 11:47:38
如果您需要的性能,直接使用它:
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);
}
}
}
可能重複:http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c – 2011-03-30 13:44:36