【问题标题】:What is the safest way to subtract two System.Runtime.InteropServices.ComTypes.FILETIME objects减去两个 System.Runtime.InteropServices.ComTypes.FILETIME 对象的最安全方法是什么
【发布时间】:2011-06-10 02:14:01
【问题描述】:

我想知道减去两个 System.Runtime.InteropServices.ComTypes.FILETIME 对象的最安全方法是什么?我使用了以下代码,但有时由于低 32 位值中的负数,它给了我 ArithmaticOverflow 异常。我不确定用unchecked 封装身体是否能达到目的。请给我一些建议,告诉我如何安全地执行此操作而不会收到任何运行时异常或 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;
        }

【问题讨论】:

    标签: c# .net bitwise-operators overflowexception filetime


    【解决方案1】:

    你需要使用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);
        }
    

    如果需要,您可以使用 DateTime.FromFileTimeUtc() 转换为 DateTime。

    【讨论】:

      【解决方案2】:

      您可以使用DateTime.FromFileTime() 方法将 FILETIME 转换为 DateTime 对象,然后您可以安全地减去 DateTime 对象。

      如果您遇到同样的问题,请使用以下方法,因为 DateTime.FromFileTime() 并非在所有情况下都有效,这要归功于已签名/未签名的问题。

      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 );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 2013-12-01
        • 2011-05-16
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多