减去两个system.runtime.interopservices.comtepes.filetime对象的最安全方法是什么
-
11-10-2019 - |
题
我想知道减去两个的最安全方法是什么 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;
}
解决方案
您需要使用 未选中 抑制例外:
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。
其他提示
您可以使用Filetime将Filetime转换为DateTime对象 datetime.fromfiletime() 方法,然后您可以安全地提取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 );
}
}
不隶属于 StackOverflow