1

私がフォローしようとしているMSDNドキュメントはここにあります。基本的に、私はC#で、そのポインターをDHCP_OPTION_DATA構造体のリストに読み込む方法を理解しようとしています。

私は次のコードを持っていますが、これを行うのに適切な方法ではないと思います。

DHCP_OPTION_ARRAY optionArray = (DHCP_OPTION_ARRAY)Marshal.PtrToStructure(options, typeof(DHCP_OPTION_ARRAY));
List<DHCP_OPTION> allOptions = new List<DHCP_OPTION>();
for (int i = 0; i < optionArray.NumElements; i++) {
    DHCP_OPTION option = (DHCP_OPTION)Marshal.PtrToStructure(optionArray.Options, typeof(DHCP_OPTION));
    allOptions.Add(option);
    optionArray.Options = (IntPtr)((int)optionArray.Options + (int)Marshal.SizeOf(option));
}

ポインタをジェネリックリストコレクションにマーシャリングできないので、この方法を試しました。私の問題は、IntPtrをどれだけ増やしたかに基づいて歪んだ結果が得られることです。当初、私はこれを行っていました。

optionArray.Options = (IntPtr)((int)optionArray.Options + (int)Marshal.SizeOf(typeof(DHCP_OPTION_DATA)));

しかし、次の要素は実際のオプションのサイズの後に配置されることに気付きました。

それで、問題はまだ残っています、どうすれば構造のリストにPtrをマーシャリングできますか?

編集1

間違った記事を投稿しましたが、修正されました。

編集2

どちらの回答も素晴らしいものでしたが、情報のマーシャリングのバックエンドでデータがどのように処理されているかについての理解不足に対処したため、問題の回答を選択しました。

4

2 に答える 2

2

あなたが得る最初のオプションオブジェクトは正しいですか?
もしそうなら、残りが歪んでいる理由はおそらく構造の整列です

たとえば、正しい配置を見つけることができます。

var offset = (int)Marshal.SizeOf(typeof(DHCP_OPTION_DATA));
var alignment = 4; 
var remainder = offset % alignment;
if(remainder != 0)
    offset += alignment - remainder;

optionArray.Options = (IntPtr)((int)optionArray.Options + offset);
于 2012-12-12T13:04:16.187 に答える
0

これは、JasonRupardがDHCP_OPTION_ARRAYを使用して書いた論文です...

http://www.rupj.net/portfolio/docs/dws-writeup.pdf

彼はあなたが必要とするすべてのものを持っているように見えます...:)

Packそれを見ると、構造を少し異なる方法で定義し、属性を正​​しく取得すれば、逆シリアル化時に自動的に配列に変換することができます。

于 2012-12-13T21:41:42.583 に答える