具有不同数据类型的C#中的memcpy

时间:2011-09-07 14:39:12

标签: c# .net

我正在将c ++代码移植到c#中。正如所解释的,有两种结构 下面。 //必须总共180个字节

typedef struct MAINTENANCE_PARAM`
{
    BYTE bCommand;
    BYTE bSubCommand;
    USHORT usDataLength;
    union  // Must be no larger than 176 bytes
    {
        MyStruct1 myStruct1;
                MyStruct2 myStruct2;
        BYTE bDummy[176];
    } data;
} MAINTENANCE_PARAM;

typedef struct _OCI_PARAM {
    SHORT  sType;          // Size: 2
    LONG   lValue;         //  4
    SHORT  sScale;         //  2
    LONG   lValueTabIdx;   //  4
} OCI_PARAM[OCI_MAXPARAM];    //Size: OCI_MAXPARAM = 15  // 15 * 12 = 180

我的代码以下列方式使用memcpy。

MAINTENANCE_PARAM maintainanceParam;
    OCI_PARAM ociParam       

    // Copy recieved structure to correct format
    memcpy((void*)& maintainanceParam, (void*) ociParam, sizeof(OCI_PARAM));

据我所知,C#中没有memcpy的代码。那我该如何移植呢? 上面的代码进入C#。我是C#的新手。我不太了解 C#。那么任何人都能告诉我我是如何实现上述目标的 C#中的代码行。我需要将180个字节从一个结构复制到另一个具有不同数据类型的结构对象 在此先感谢任何帮助。 问候, 阿希什

2 个答案:

答案 0 :(得分:3)

使用结构的StructLayoutAttributeFieldOffsetAttribute,以便您可以显式布局字段,然后导入RtlMoveMemory(P / Invoke)。您可以修改签名以获取任何指针类型(在不安全的上下文中)或使用PInvoke.net上的标准签名。

unsafe class Program {

    [System.Runtime.InteropServices.DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
    private static extern void MoveMemory(void* dest, void* src, int size);

    static  void Main(string[] args) {

        Maintenance_Param p1 = new Maintenance_Param();
        p1.bCommand = 2;
        p1.bSubCommand = 3;
        p1.usDataLength = 3;
        p1.myStruct1 = new MyStruct1();

        Maintenance_Param p2 = new Maintenance_Param();
        MoveMemory(&p2, &p1, sizeof(Maintenance_Param));
    }
}

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)]
public struct Maintenance_Param {

    // fields should be private and be accessed over properties ...
    [System.Runtime.InteropServices.FieldOffset(0)]
    public byte bCommand;
    [System.Runtime.InteropServices.FieldOffset(1)]
    public byte bSubCommand;
    [System.Runtime.InteropServices.FieldOffset(2)]
    public ushort usDataLength;
    [System.Runtime.InteropServices.FieldOffset(4)]
    public MyStruct1 myStruct1;
    [System.Runtime.InteropServices.FieldOffset(4)]
    public MyStruct2 myStruct2;
}

public struct MyStruct1 {
    int value;
}

public struct MyStruct2 {
    int value;
}

答案 1 :(得分:1)

MemCpy在.NET中存在!尝试使用Google搜索OpCodes.Cpblk。以下是一个示例:http://www.abstractpath.com/weblog/2009/04/memcpy-in-c.html