C++代码:
struct tPacket { WORD word1; WORD word2; BYTE byte1; BYTE byte2; BYTE array123[8]; } static char data[8192] = {0}; ... some code to fill up the array ... tPacket * packet = (tPacket *)data;
我们不能在C#中轻松做到这一点.
请注意,C++结构中有一个数组.
或者,使用此源文件可以为我们完成工作,但如果结构中有数组则不行.
我不确定你究竟在问什么.您是否尝试在C#中获取等效的结构定义以用于普通的旧C#用法或用于互操作(PInvoke)目的?如果它适用于PInvoke,则follownig结构将起作用
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct tPacket { /// WORD->unsigned short public ushort word1; /// WORD->unsigned short public ushort word2; /// BYTE->unsigned char public byte byte1; /// BYTE->unsigned char public byte byte2; /// BYTE[8] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=8, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)] public byte[] array123; }
如果您正在寻找具有相同特征的普通旧C#结构,那么遗憾的是不可能使用结构.您无法在C#结构中定义常量大小的内联数组,也无法通过初始化程序强制数组为特定大小.
托管世界中有两种备选方案.
使用具有填充数组的create方法的结构
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct tPacket { public ushort word1; public ushort word2; public byte byte1; public byte byte2; public byte[] array123; public static tPacket Create() { return new tPacket() { array123 = new byte[8] }; } }
或者使用一个类,您可以直接初始化array123成员变量.
EDIT OP知道如何将byte []转换为tPacket值
不幸的是,在C#中没有很好的方法可以做到这一点.C++对于这种任务很棒,因为它有一个非常弱的类型系统,你可以选择将字节流视为一个特定的结构(邪恶的指针转换).
这在C#不安全代码中可能是可能的,但我不相信.
基本上,您需要做的是手动解析字节并将它们分配给结构中的各种值.或者编写一个本地方法,将C样式转换和PInvoke转换为该函数.