Принесите uint64_t в FILETIME
Я пытаюсь получить байтовый массив из файла, интерпретировать его как uint64_t
а затем наложить эту уинт FILETIME
После поиска и отладки я застрял в следовании неправильному рабочему коду.
uint64_t win_filetime = *(uint64_t*)(&(((char*)buf)[(int)FILETIME_OFFSET]));
//at this moment win_filetime = 0x01cb3f90e7b52500
где buf
содержит необходимые байты в FILETIME_OFFSET
Затем пытаюсь разыграть t1 = *(FILETIME *)(&win_filetime);
или же
t1.dwLowDateTime = (DWORD)win_filetime;
t1.dwHighDateTime = (DWORD)(win_filetime >> 32);
передать его функции
tm FILETIME_to_time_t(const FILETIME *lpFileTime) {
time_t result;
SYSTEMTIME st;
struct tm tmp;
FileTimeToSystemTime(lpFileTime,&st);
memset(&tmp,0,sizeof(struct tm));
tmp.tm_mday = st.wDay;
tmp.tm_mon = st.wMonth - 1;
tmp.tm_year = st.wYear - 1900;
tmp.tm_sec = st.wSecond;
tmp.tm_min = st.wMinute;
tmp.tm_hour = st.wHour;
return tmp;
}
функция FILETIME_to_time_t()
возвращает мусор (т.е. год = 110)
Пример значения из файла: 0025B5E7903FCB0100
что HexWorkshop правильно разбирает как 11:23:10 19.08.2010
Может быть, отсутствует преобразование порядка байтов или что-то еще, что я сейчас не могу обнаружить?
1 ответ
Кажется, ваш код в порядке, просто год показывает 110, потому что при заполнении struct tm
, Это стандартноstruct tm
должен содержать год минус 1900. Вам просто нужно быть осторожным при печати значения.