Как скопировать данные, указанные byte*, в буфер, указанный IntPtr? (С#)

В С#. Я работаю с изображениями, полученными из небезопасного контекста. У меня есть целое число с размером изображения и пикселями изображения, указанными переменной byte*. Я хотел бы скопировать эти пиксели в буфер, на который указывает IntPtr. Как я могу это сделать?

byte* imgData;        // image data
uint uiDataSize;      // image size
...
IntPtr ptr;
buffer.GetPointer(out ptr);

person Alfre2    schedule 24.11.2013    source источник


Ответы (3)


Я не верю, что существует фреймворковый метод, который будет работать. Marshal.Copy может копировать память в буфер IntPtr и из него, но не работает с указателями.

Вместо этого вы можете P/вызвать собственный MoveMemory, которая копирует память между двумя указателями.

[DllImport("Kernel32.dll", EntryPoint="RtlMoveMemory", SetLastError=false)]
static extern void MoveMemory(IntPtr dest, IntPtr src, UIntPtr size);
...
byte* imgData;        // image data
uint uiDataSize;      // image size
...
IntPtr ptr;
buffer.GetPointer(out ptr);
MoveMemory(ptr, (IntPtr)imgData, (UIntPtr)uiDataSize);

Да, параметр size для MoveMemory равен UIntPtr, а не int, потому что SIZE_T, используемый в собственном коде, составляет 32 бита в 32-битных системах и 64 бита в 64-битных системах.

person shf301    schedule 24.11.2013

Используйте System.Runtime.Interopservice.Marshal.Copy, если я правильно понял. Проверьте функцию, и вы будете знать, как ее использовать.

person Ge Rong    schedule 24.11.2013