Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 减去两个System.Runtime.InteropServices.ComTypes.FILETIME对象最安全的方法是什么_C#_.net_Bitwise Operators_Overflowexception_Filetime - Fatal编程技术网

C# 减去两个System.Runtime.InteropServices.ComTypes.FILETIME对象最安全的方法是什么

C# 减去两个System.Runtime.InteropServices.ComTypes.FILETIME对象最安全的方法是什么,c#,.net,bitwise-operators,overflowexception,filetime,C#,.net,Bitwise Operators,Overflowexception,Filetime,我想知道减去两个System.Runtime.InteropServices.ComTypes.FILETIME对象最安全的方法是什么?我使用了下面的代码,但有时由于低32位值中的负数,它会给我带来算术溢出异常。我不确定用未选中的来封闭主体是否会起到作用。请给我一些建议,如何安全地执行此操作,而不会收到任何运行时异常或CS0675警告消息 private static UInt64 SubtractTimes(FILETIME a, FILETIME b) {

我想知道减去两个
System.Runtime.InteropServices.ComTypes.FILETIME
对象最安全的方法是什么?我使用了下面的代码,但有时由于低32位值中的负数,它会给我带来算术溢出异常。我不确定用
未选中的
来封闭主体是否会起到作用。请给我一些建议,如何安全地执行此操作,而不会收到任何运行时异常或CS0675警告消息

private static UInt64 SubtractTimes(FILETIME a, FILETIME b)
        {
            UInt64 aInt = ((UInt64)(a.dwHighDateTime << 32)) | (UInt32)a.dwLowDateTime;
            UInt64 bInt = ((UInt64)(b.dwHighDateTime << 32)) | (UInt32)b.dwLowDateTime;
            return aInt - bInt;
        }
私有静态UInt64次(文件时间a、文件时间b)
{

UInt64 aInt=((UInt64)(a.dwHighDateTime您可以使用方法将FILETIME转换为DateTime对象,然后可以安全地减去DateTime对象

如果您将遇到相同的问题,请使用下面的方法,因为由于签名/未签名的问题,无法在所有情况下工作

public static DateTime ToDateTime( System.Runtime.InteropServices.FILETIME ft )
{
  IntPtr buf = IntPtr.Zero;
  try 
  {
    long[] longArray = new long[1];
    int cb = Marshal.SizeOf( ft );
    buf = Marshal.AllocHGlobal( cb );
    Marshal.StructureToPtr( ft, buf, false );
    Marshal.Copy( buf, longArray, 0, 1 );
    return DateTime.FromFileTime( longArray[0] );
  }
  finally 
  {
    if ( buf != IntPtr.Zero ) Marshal.FreeHGlobal( buf );
  }
}
您需要使用unchecked来抑制异常:

    public static long FileTime2Long(FILETIME ft) {
        uint low = unchecked((uint)ft.dwLowDateTime);
        return (long)ft.dwHighDateTime << 32 | low;
    }

    static void Test() {
        FILETIME ft = new FILETIME();
        ft.dwHighDateTime = 1;
        ft.dwLowDateTime = -1;
        long value = FileTime2Long(ft);
        Debug.Assert(value == 0x1ffffffff);
    }
public静态长FileTime2Long(FILETIME-ft){
uint low=未选中((uint)ft.dwLowDateTime);
返回(长)ft.dwHighDateTime