J'ai un .dll (pas le mien) qui a un délégué. Cette fonction de rappel délégué est:
"CallBackFN (ushort opCOde, IntPtr payload, uint size, uint localIP)"
Comment puis-je convertir IntPtr en octet []? Je pense que la charge utile est en fait Byte []. Si ce n'est pas Byte [] et que c'est autre chose, est-ce que je perdrais des données?
Avez-vous examiné le maréchal Copie?
http://msdn.Microsoft.com/en-us/library/system.runtime.interopservices.marshal.copy.aspx
Si c'est des octets:
byte[] managedArray = new byte[size];
Marshal.Copy(pnt, managedArray, 0, size);
S'il ne s'agit pas d'octets, le paramètre de taille dans de Marshal.Copy est le nombre d'éléments dans le tableau, pas la taille d'octet. Donc, si vous aviez un tableau int [] plutôt qu'un tableau byte [], vous devrez diviser par 4 (octets par int) pour obtenir le nombre correct d'éléments à copier, en supposant que votre paramètre de taille transmis via le rappel se réfère à # d'octets.
Si vous avez besoin de performances, utilisez-les directement:
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);
}
}
}
Selon cette question de débordement de pile , vous pouvez effectuer les opérations suivantes:
var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
Vous pouvez utiliser méthode Marshal.Copy (IntPtr, Byte [], Int32, Int32)