编组时LARGE_INTEGER值发生了变化:从LARGE_INTEGER到UINT64(C)到C#的uint64

时间:2011-12-11 08:59:01

标签: c# pinvoke marshalling endianness deviceiocontrol

我尝试通过ioctl将NdisGetCurrentSystemTime结果编组到C#程序中。

LARGE_INTEGER data;
NdisGetCurrentSystemTime (&data );
marshal_data->time = (UINT64)(data.QuadPart / 10^6);
    DBGPRINT(("Time: %64u", marshal_data->time));

在C#接收方,时间字段定义为uint64;在编组结构中还有一些其他uint64字段。但是,在做的时候

    String.Format(("Time was {0}", recv_data->time)) 

我得到的意外大号与DBGPRINT中的大号不同。

C#:

    [StructLayout(LayoutKind.Sequential)]
    ...
    public UInt64 time

C:

    struct _marshalme {
    ... 
    UINT64 time
    ...
    }

字节顺序有什么奇怪之处吗?

2 个答案:

答案 0 :(得分:0)

LARGE_INTEGER代表64-bit signed integer。我希望您的问题来自使用UInt64而不是Int64

答案 1 :(得分:0)

问题主要在于不正确的结构对齐,因此大小不同;但由于某种原因,即使大小相同,它仍然会在转移时保持数据传输(例如,最后DBGPRINT正确打印保存的值)为int32,int64情况;我被迫使用

  long startTime;
  long padding;

接收适当的价值,因为C#很长,其他的编组方式失败了。将在稍后发布更多完整的样本,除非 - 问题已关闭。