c# byte bytearray intptr

C#cómo obtener Byte[] de IntPtr



Tengo un .dll (no el mío) que tiene un delegado. Esta función delegada Callback es:
"CallBackFN (ushort opCOde, IntPtr payload , uint size, uint localIP)"

¿Cómo puedo convertir IntPtr a Byte []? Creo que la carga útil es en realidad Byte []. Si no es Byte [] y es algo más, ¿perdería algunos datos?


De acuerdo con esta pregunta sobre desbordamiento de pila , puede hacer lo siguiente:

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



Si es bytes:

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

Si no son bytes, el parámetro de tamaño en Marshal.Copy es la cantidad de elementos en la matriz, no el tamaño del byte. Entonces, si tuviera una matriz int [] en lugar de una matriz byte [], tendría que dividir por 4 (bytes por int) para obtener el número correcto de elementos para copiar, suponiendo que su parámetro de tamaño pasó por la devolución de llamada se refiere a # de bytes.


Si necesitas rendimiento, úsalo directamente:

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