2012-11-30 82 views
1

我試圖遵循的MSDN文檔位於here。基本上我想弄清楚在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

我貼錯了文章,現在是固定的。

EDIT 2

雖然兩者的答案是偉大的,我選擇了回答我的問題,因爲它解決了我缺乏的是如何將數據正在封送處理信息的後端處理的理解。

回答

2

第一個選項對象是否正確?
如果是這樣,其餘的傾向最可能的原因是alignment of the structure

你可以嘗試找到正確的對齊,例如:

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); 
+0

好的,我今晚一定會在我回家的時候檢查一下。 – meanbunny

+0

@meanbunny:你有工作嗎? –

+0

是的,我確實做到了,你的回答幫助我到達那裏,並給了我我的理解,即我正在尋找。我不知道它是如此簡單化,我認爲它會比這更復雜 – meanbunny

0

這裏是一紙傑森Rupard使用DHCP_OPTION_ARRAY寫...

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

看起來他擁有一切你需要更多... :)

雖然看着它,你可以定義結構有點不同,並有它如果您獲得Pack屬性,則會在反序列化時自動轉換爲數組。

+0

想知道是否還有什麼需要我獲得賞金? – Jay

+1

您應該提取該文檔的相關部分並在此處複製它們。當鏈接關閉時,您的答案將無用。即使鏈接保持不變,您鏈接的文檔長達一百頁,因此很難提取您所指的信息。 –