C# как получить Byte[] из IntPtr
У меня есть .dll(не моя), у которой есть делегат. Эта функция обратного вызова делегата:
"CallBackFN (ushort opCOde, полезная нагрузка IntPtr, uint размер, uint localIP)"
Как преобразовать IntPtr в Byte[]? Я думаю, что полезная нагрузка на самом деле Byte []. Если это не Byte [], и это что-то еще, я потеряю некоторые данные?
5 ответов
вы проверили Маршала.Копия?
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.copy.aspx
Если это байт:
byte[] managedArray = new byte[size];
Marshal.Copy(pnt, managedArray, 0, size);
Если это не байты, параметр size в маршале.Копия-это количество элементов в массиве, а не размер в байтах. Таким образом, если у вас есть массив int [], а не массив byte [], вам придется разделить на 4 (байты на int), чтобы получить правильное количество элементов для копирования, предполагая, что ваш параметр size, переданный через обратный вызов, относится к # байтов.
Если вам нужна производительность, используйте ее напрямую:
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);
}
}
}
по данным этот вопрос переполнения стека, вы можете сделать следующее:
var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
можно использовать Маршал.Метод Копирования (Указателя IntPtr, Байт[], Типа Int32, Int32) В