我不确定你在问什么。您是否尝试在 C# 中为普通的旧 C# 用法或互操作(PInvoke)目的获得等效的结构定义?如果是用于 PInvoke,则后续结构将起作用
[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# 结构中定义一个恒定大小的内联数组,也不能通过初始化程序强制该数组为特定大小。
在托管世界中有两种备选方案。
使用具有填充数组的创建方法的结构
[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 成员变量的类。
编辑OP watns 以了解如何将 byte[] 转换为 tPacket 值
不幸的是,在 C# 中没有很好的方法来做到这一点。C++ 非常适合这种任务,因为它的类型系统非常弱,您可以选择将字节流视为特定结构(邪恶指针转换)。
这在 C# 不安全代码中可能是可能的,但我不相信它是。
本质上,您要做的就是手动解析字节并将它们分配给结构中的各种值。或者编写一个本地方法,将 C 样式转换和 PInvoke 放入该函数中。