gpt4 book ai didi

c# - 使用 memcpy 从 C++ 到 C#

转载 作者:行者123 更新时间:2023-11-30 02:42:16 25 4
gpt4 key购买 nike

我正在写一个 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#中使用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));
}
}
}

关于c# - 使用 memcpy 从 C++ 到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27266833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com