2014-12-03 373 views
1

我正在寫arduino和c#之間的流媒體類。我使用C++爲arduino編寫了它,它像一個魅力一樣工作。現在,我正嘗試將我的代碼遷移到C#上。從C++使用memcpy到c#

Stream::reciveObj(Stream &str, void* ptr, unsigned int Size) 
{ 
char data[objSize]; //Create a tmp array 
stream.readBytes(data, objSize); //Read bytes 
memcpy(ptr, data, objSize); //Copy into struct 
} 

現在我想的是代碼遷移到C#

unsafe public static void recieveObj(SerialPort str, void* ptr, uint Size) 
{ 
char[] data = new char[Size]; 
str.Read(data, 0, (int)Size); 
// memcpy(ptr, data, objSize); //Copy into struct 
} 

我怎麼能做出的memcpy從陣列到void *在C#

感謝

+0

如何[在C#複製的陣列/淨](http://msdn.microsoft.com/en-us/library/system.array。複製%28v = vs.110%29.aspx)應該很容易找到,如果你只是搜索一下。 – 2014-12-03 08:30:11

+0

這種方式不起作用:D我搜索了很多! – 2014-12-03 08:38:21

回答

1

這裏是一個辦法在c#中使用memcpy,羞於借用here

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Linq; 
using System.Reflection; 
using System.Reflection.Emit; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace Test 
{ 
public unsafe class Program 
{ 
public delegate void MemCpyFunction(void *des, void *src, uint bytes); 

private static readonly MemCpyFunction MemCpy; 

static Program() 
{ 
    var dynamicMethod = new DynamicMethod 
    (
     "MemCpy", 
     typeof(void), 
     new [] { typeof(void *), typeof(void *), typeof(uint) }, 
     typeof(Program) 
    ); 

    var ilGenerator = dynamicMethod.GetILGenerator(); 

    ilGenerator.Emit(OpCodes.Ldarg_0); 
    ilGenerator.Emit(OpCodes.Ldarg_1); 
    ilGenerator.Emit(OpCodes.Ldarg_2); 

    ilGenerator.Emit(OpCodes.Cpblk); 
    ilGenerator.Emit(OpCodes.Ret); 

    MemCpy = (MemCpyFunction)dynamicMethod 
       .CreateDelegate(typeof(MemCpyFunction)); 
} 

static void Main(string[] args) 
{ 
    var point1 = new Point 
        { 
         X = 10, 
         Y = 20 
        }; 

    var point2 = new Point(); 

    MemCpy(&point2, &point1, (uint)sizeof(Point)); 
} 
} 
} 
+0

好,但它只是複製相同類型的對象,我需要將字節數組複製到* void – 2014-12-03 08:50:30

1

找到了答案: + @rickythefox

char* charPointer = stackalloc char[(int)objSize]; 
      for(int i=0; i < (int)objSize ; ++i) 
      { 
       charPointer[i] = data[i]; 
      } 

      MemCpy(ptr, charPointer, objSize);