質問
現在、C#でDHCPMessageクラスを構築しています。
RFCはこちらから入手できます: http://www.faqs.org/rfcs/rfc2131.html
擬似
public object DHCPMessage
{
bool[8] op;
bool[8] htype;
bool[8] hlen;
bool[8] hops;
bool[32] xid;
bool[16] secs;
bool[16] flags;
bool[32] ciaddr;
bool[32] yiaddr;
bool[32] siaddr;
bool[32] giaddr;
bool[128] chaddr;
bool[512] sname;
bool[1024] file;
bool[] options;
}
各フィールドが固定された長さビットアレイであると想像する場合、何が次のとおりですか。
- 最も汎用性があります
- ベストプラクティス
これをクラスとして表現する方法???
または..これをどのように書きますか? :)
解決
あなたはこれで間違った道を歩んでいます、それは少しベクトルではありません。メッセージは、「バイト」としてよく知られている「オクテット」で定義されています。 Marshal.PtrToStructureで使用できる同等のC#宣言は次のとおりです。
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
struct DHCPMessage {
public byte op;
public byte htype;
public byte hlen;
public byte hops;
public uint xid;
public ushort secs;
public ushort flags;
public uint ciaddr;
public uint yiaddr;
public uint siaddr;
public uint giaddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=16)]
public byte[] chaddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
public string sname;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string file;
}
変数長オプションフィールドを個別に処理する必要があります。
他のヒント
手始めに、あなたは試すかもしれません ビタレイ クラス。ここで車輪を再発明する必要はありません。
スペース/メモリがあまりにも多くのことをするのが心配なら、そうしないでください。正しいサイズに初期化するだけです:
BitArray op = new BitArray(8);
(上記は8ビットを保持し、1バイトを占有する必要があります)
これらのいくつかにビットアレイを使用したいですか?たとえば、8ビットでBYTE、32ビットのINT、および「Sname」のようなターミングされた文字列にマッピングされるピースには、バイト配列を使用できます。次に、単純なビットワイズ演算子(&、|)を使用して、ビットをチェック/操作できます。
以下は、TCPヘッダーを構造に変換することについて行った投稿をいくつか紹介します。
http://taylorza.blogspot.com/2010/04/archive-structure-from-binary-data.html http://taylorza.blogspot.com/2010/04/archive-binary-data-from-structure.html
これらは非常に古いので、私は彼らが迷子にならないように私の古いブログからそれらを移行しました。