什么是将FILETIME结构转换为__int64的正确方法?你能告诉我吗?
FILETIME
__int64
omtl5h9j1#
我不认为你应该:“请勿将指向FILETIME结构的指针强制转换为ULARGE_INTEGER*或__int64*值,因为这可能导致64位Windows上的对齐错误。”Source.如果你真的想这样做的话:
ULARGE_INTEGER*
__int64*
__int64 to_int64(FILETIME ft) { return static_cast<__int64>(ft.dwHighDateTime) << 32 | ft.dwLowDateTime; } FILETIME ft = // ... __int64 t = to_int64(ft);
但类似于:
FILETIME ft = // ... __int64 t = *reinterpet_cast<__int64*>(&ft);
很糟糕。
btxsgosb2#
没有必要使用按位OR来恢复《双城之战》的结构。Windows API已经提供了完成此操作所需的一切。
unsigned __int64 convert( const FILETIME & ac_FileTime ) { ULARGE_INTEGER lv_Large ; lv_Large.LowPart = ac_FileTime.dwLowDateTime ; lv_Large.HighPart = ac_FileTime.dwHighDateTime ; return lv_Large.QuadPart ; }
或者如果您想直接转到__int64。
__int64 convert_to_int64( const FILETIME & ac_FileTime ) { return static_cast< __int64 > ( convert( ac_FileTime ) ) ; }
eoigrqb63#
试试看
(__int64(filetime.dwHighDateTime)<<32) | __int64(filetime.dwLowDateTime)
w51jfk4q4#
当然,你可以像下面这样传入一个__int64转换为一个文件时间 (FILETIME)&int64Val。这在Visual C++下可以很好地工作。即
__int64 createTime = 0; __int64 accessTime = 0; __int64 writeTime = 0; GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );
5f0d552i5#
你可以试试下面的代码.这代码是从 chrome 项目
template <class Dest, class Source> inline Dest bit_cast(const Source& source) { Dest dest; memcpy(&dest, &source, sizeof(dest)); return dest; } //FILETIME to __int64 __int64 FileTimeToMicroseconds(const FILETIME& ft) { return bit_cast<__int64, FILETIME>(ft) / 10; } void MicrosecondsToFileTime(__int64 us, FILETIME* ft) { *ft = bit_cast<FILETIME, __int64>(us * 10); } int _tmain(int argc, _TCHAR* argv[]) { __int64 nTmpUint64 = 13060762249644841; time_t unixtime; FILETIME nTmpFileTm; MicrosecondsToFileTime(nTmpUint64,&nTmpFileTm); return 0; }
h22fl7wq6#
我遇到了完全相同的问题,在谷歌上搜索了一下,然后来到了这里。但我也找到了一个有用的微软支持页面,网址是https://support.microsoft.com/en-gb/help/188768/info-working-with-the-filetime-structure上面写着:
通常有必要对文件时间执行简单的算术运算。例如,您可能需要知道文件何时存在30天。要对文件时间执行算术运算,您需要将FILETIME转换为四字(64位整数),执行算术运算,然后将结果转换回FILETIME。假设ft是包含文件创建时间的FILETIME结构,下面的示例代码会将时间增加30天:
ULONGLONG qwResult; // Copy the time into a quadword. qwResult = (((ULONGLONG) ft.dwHighDateTime) << 32) + ft.dwLowDateTime; // Add 30 days. qwResult += 30 * _DAY; // Copy the result back into the FILETIME structure. ft.dwLowDateTime = (DWORD) (qwResult & 0xFFFFFFFF ); ft.dwHighDateTime = (DWORD) (qwResult >> 32 );
编辑:我意识到这只是证实了一些其他的答案,但我认为这是值得补充的澄清。
jtjikinw7#
auto ull = std::bit_cast<unsigned long long>(ft)
缺点:没有。
auto ull = *reinterpret_cast<_UNALIGNED unsigned long long*>(&ft)
缺点:_UNALIGNED宏(和__unaligned修饰符)是非标准的,但是几乎每个编译器都有这个修饰符。
_UNALIGNED
__unaligned
memcpy(&ull, &ft, sizeof(ull))
缺点:只有当你打开"启用内在函数" C++编译器选项时,这段代码才能得到很好的优化。
(static_cast<unsigned long long>(ft.dwHighDateTime) << 32) | ft.dwLowDateTime
生成按位运算。
ULARGE_INTEGER{ft.dwLowDateTime, ft.dwHighDateTime}.QuadPart
生成两个32位操作,而不是一个64位操作。
7条答案
按热度按时间omtl5h9j1#
我不认为你应该:“请勿将指向
FILETIME
结构的指针强制转换为ULARGE_INTEGER*
或__int64*
值,因为这可能导致64位Windows上的对齐错误。”Source.
如果你真的想这样做的话:
但类似于:
很糟糕。
btxsgosb2#
没有必要使用按位OR来恢复《双城之战》的结构。Windows API已经提供了完成此操作所需的一切。
或者如果您想直接转到__int64。
eoigrqb63#
试试看
w51jfk4q4#
当然,你可以像下面这样传入一个__int64转换为一个文件时间 (FILETIME)&int64Val。这在Visual C++下可以很好地工作。
即
5f0d552i5#
你可以试试下面的代码.这代码是从 chrome 项目
h22fl7wq6#
我遇到了完全相同的问题,在谷歌上搜索了一下,然后来到了这里。但我也找到了一个有用的微软支持页面,网址是
https://support.microsoft.com/en-gb/help/188768/info-working-with-the-filetime-structure
上面写着:
通常有必要对文件时间执行简单的算术运算。例如,您可能需要知道文件何时存在30天。要对文件时间执行算术运算,您需要将FILETIME转换为四字(64位整数),执行算术运算,然后将结果转换回FILETIME。
假设ft是包含文件创建时间的FILETIME结构,下面的示例代码会将时间增加30天:
编辑:我意识到这只是证实了一些其他的答案,但我认为这是值得补充的澄清。
jtjikinw7#
具有最佳性能的三种方式(一条汇编指令)。仅在Visual C++2022 x64中测试。
缺点:没有。
缺点:
_UNALIGNED
宏(和__unaligned
修饰符)是非标准的,但是几乎每个编译器都有这个修饰符。缺点:只有当你打开"启用内在函数" C++编译器选项时,这段代码才能得到很好的优化。
其他答案会有一些开销。
生成按位运算。
生成两个32位操作,而不是一个64位操作。