我要关注的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
我发布了错误的文章现在已修复。
编辑2
虽然两个答案都很棒,但我选择了我的问题的答案,因为它解决了我对如何在编组信息的后端处理数据缺乏了解。
答案 0 :(得分: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);
答案 1 :(得分:0)
这是Jason Rupard使用DHCP_OPTION_ARRAY写的一篇论文......
http://www.rupj.net/portfolio/docs/dws-writeup.pdf
看起来他拥有你需要的一切以及更多...:)
虽然看一下它,你可以稍微改变一下结构,如果你得到Pack
属性,它会在反序列化时自动变成一个数组。