【问题标题】:How do I retrieve the list from said pointer?如何从所述指针中检索列表?
【发布时间】:2012-11-30 04:57:47
【问题描述】:

我尝试关注的 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

虽然这两个答案都很好,但我选择了我的问题的答案,因为它解决了我对在封送信息的后端如何处理数据缺乏了解的问题。

【问题讨论】:

    标签: c# pointers pinvoke


    【解决方案1】:

    你得到的第一个选项对象是否正确?
    如果是这样,其余部分被歪曲的原因很可能是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);
    

    【讨论】:

    • 好的,我今晚回家一定会看看这个。
    • 是的,我确实做到了,您的回答帮助我到达了那里,并让我明白了我正在寻找的东西。我不知道它是如此简单,我认为它会比这复杂得多
    • @meanbunny:很高兴听到这个消息。如果您可以为其他人发布您的最终解决方案,那就太好了。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 只是想知道你是否还需要我获得赏金?
    • 您应该提取该文档的相关部分并在此处复制它们。否则,当链接断开时,您的答案将毫无用处。即使链接保持不变,您链接的文档也有一百多页,很难提取您想要的信息。
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多