あなたが何を求めているのか正確にはわかりません。単純な古い C# の使用または相互運用 (PInvoke) の目的で、C# で同等の構造定義を取得しようとしていますか? 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# 構造体で定数サイズのインライン配列を定義することはできません。また、初期化子を使用して配列を特定のサイズに強制することもできません。
管理された世界には 2 つの代替オプションがあります。
配列を埋める 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 メンバー変数を直接初期化できるクラスを使用します。
編集OPは、バイト[]をtPacket値に変換する方法を知るために待機します
残念ながら、C# でこれを行う優れた方法はありません。C++ は、バイトのストリームを特定の構造 (悪意のあるポインター キャスト) として表示することを選択できるという点で非常に弱い型システムを持っているため、この種のタスクには最適でした。
これは C# の安全でないコードで可能かもしれませんが、そうではないと思います。
基本的に、バイトを手動で解析し、構造体のさまざまな値に割り当てる必要があります。または、C スタイルのキャストと PInvoke をその関数に実行するネイティブ メソッドを記述します。