Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编组时更改大整型值:从大整型到UINT64(C)再到C';s uint64_C#_Pinvoke_Marshalling_Endianness_Deviceiocontrol - Fatal编程技术网

C# 编组时更改大整型值:从大整型到UINT64(C)再到C';s uint64

C# 编组时更改大整型值:从大整型到UINT64(C)再到C';s uint64,c#,pinvoke,marshalling,endianness,deviceiocontrol,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;编组结构中还有几个其他u

我试图通过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#:

C:


字节顺序有什么奇怪的地方吗?

大整数
表示一个。我希望您的问题来自于使用
UInt64
而不是
Int64

,问题主要在于结构对齐不当,因此大小不同;但由于某些原因,对于int32、int64情况,即使大小相同,它似乎也会在传输时保留损坏的数据(例如,上次DBGPRINT正确打印保存的值);我被迫使用

  long startTime;
  long padding;

要将正确的值作为C#的long来接收,其他编组该值的方法都失败了。将稍后发布更多已完成的示例,除非-问题已结束。

您的DBGPRINT没有打印时间,它缺少一个参数:
DBGPRINT((“时间:%64u”)10^6也没有意义。简单的解释是C#structure声明是错误的,因此字段没有对齐。您没有发布完整的声明,从而避免了一个好的答案。@Wimmel,在实际版本中,有一个参数。不过,我一直在努力避免发布大量代码,以获得最少的示例。修正。当我们不得不猜测你的代码是什么样子时,很难帮上忙。但有符号和无符号之间的唯一区别是最高有效位。这应该是未设置的,这意味着该值应该是相同的,无论是作为有符号值还是无符号值。问题是结构对齐这一事实表明该问题是多么缺乏细节。你真的没有给我们足够的信息来解决这个问题。
    struct _marshalme {
    ... 
    UINT64 time
    ...
    }
  long startTime;
  long padding;