我正在将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个字节从一个结构复制到另一个具有不同数据类型的结构对象 在此先感谢任何帮助。 问候, 阿希什
答案 0 :(得分:3)
使用结构的StructLayoutAttribute
和FieldOffsetAttribute
,以便您可以显式布局字段,然后导入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