Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy data from from IntPtr to IntPtr

Tags:

c#

intptr

I have two IntPtr values pointing to some data areas of length bytes. length may have an order of magnitude of 200k to 400k.

int length = /* ..*/ IntPtr ptrSrc = /*.. */; IntPtr ptrDst = /* .. */; 

Now I want to copy the data from ptrSrc to ptrDst. This code works fine:

byte[] data = new byte[length]; Marshal.Copy(ptrSrc, data, 0, length); Marshal.Copy(data, 0, ptrDst, length); 

but it has the drawback of needing an additional temporary (potentially huge) array. Unfortunately, I could not find a Marshal.Copy variant in the .NET framework for copying directly from IntPtr to IntPtr, so I am looking for alternatives.

I am interested in a solution which works on 32-bit Windows as well as 64-bit Windows. Any suggestions?

like image 876
Doc Brown Avatar asked Apr 12 '13 16:04

Doc Brown


People also ask

What is marshal copy?

Copies data from a managed array to an unmanaged memory pointer, or from an unmanaged memory pointer to a managed array.

What is IntPtr C#?

The IntPtr type can be used by languages that support pointers and as a common means of referring to data between languages that do and do not support pointers. IntPtr objects can also be used to hold handles. For example, instances of IntPtr are used extensively in the System. IO.


1 Answers

You can P/Invoke into the appropiate C function. That is probably the easiest way of doing that. Example:

class Program {     [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]     public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);      static void Main()     {         const int size = 200;         IntPtr memorySource = Marshal.AllocHGlobal(size);         IntPtr memoryTarget = Marshal.AllocHGlobal(size);          CopyMemory(memoryTarget,memorySource,size);     } } 
like image 133
driis Avatar answered Oct 02 '22 12:10

driis