Принесите 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. Вам просто нужно быть осторожным при печати значения.

Другие вопросы по тегам