使用 memcpy 从 c++ 到 c#

本文关键字:c++ memcpy 使用 | 更新日期: 2023-09-27 18:33:04

我正在编写一个介于arduino和c#之间的流类。我用c ++为arduino编写了它,它就像一个魅力。现在,我正在尝试迁移我的代码以通过 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
}

如何在 C# 中制作从数组到 void* 的内存

谢谢

使用 memcpy 从 c++ 到 c#

这是在 c# 中使用 memcpy 的一种方法,可耻地借用在这里:

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));
 }
}
}

找到了答案:+ @rickythefox

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

首先,有System.Buffer.MemoryCopy(...) .这是在内部调用 pinvoked clr __Memmove(...)。这表明它能够处理重叠的块。
然后。。。
Microsoft最近发布了一个NuGet包:
System.Runtime.CompilerServices.Unsafe

特别是这个包,包含一个同名和命名空间下的静态类,其中包含
CopyBlock(void* dest, void* src, uint byteCount)
CopyBlockUnaligned(...)方法。
整个类包含很多很酷的帮助程序方法。这是伊利诺伊州的 src。它表明这些方法正在使用cpblk操作码,该操作码(根据规范)将重叠块处理为未定义的行为。