如何将byte *指向的数据复制到IntPtr指向的缓冲区? (C#)

时间:2013-11-24 04:05:59

标签: c# unsafe intptr

在C#中。我正在使用从不安全的上下文中获取的图像。我有一个整数,图像大小和图像像素由byte *变量指向。我想将这些像素复制到IntPtr指向的缓冲区中。我怎么能这样做?

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

3 个答案:

答案 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);