在C#中。我正在使用从不安全的上下文中获取的图像。我有一个整数,图像大小和图像像素由byte *变量指向。我想将这些像素复制到IntPtr指向的缓冲区中。我怎么能这样做?
byte* imgData; // image data
uint uiDataSize; // image size
...
IntPtr ptr;
buffer.GetPointer(out ptr);
答案 0 :(得分:1)
我不相信有一种框架方法可行。 Marshal.Copy可以将内存复制到IntPtr
缓冲区中,但它不能用于指针。
相反,你可以P / Invoke本地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
的{{1}}参数MoveMemory
而不是UIntPtr
,因为本机代码中使用的SIZE_T
在32位系统上为32位且64位系统上的64位。
答案 1 :(得分:0)
如果我没记错的话,请使用System.Runtime.Interopservice.Marshal.Copy
。检查功能,您将知道如何使用它。
答案 2 :(得分:0)
使用System.Runtime.Interopservice.Marshal.Copy
using System.Runtime.InteropServices;
byte* imgData; // image data
uint uiDataSize; // image size
...
IntPtr ptr;
buffer.GetPointer(out ptr);
// Copy the unmanaged array to a managed array.
byte[] managedArray = new byte[lengthOfData];
Marshal.Copy(imgData, managedArray, 0, lengthOfData);