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

这是 Jason Rupard 使用 DHCP_OPTION_ARRAY 写的一篇论文...

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

看起来他有你需要的一切,还有更多...... :)

Pack虽然看着它,你可以稍微不同地定义结构,如果你得到正确的属性,它会在反序列化时自动变成一个数组。

于 2012-12-13T21:41:42.583 回答