Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> упаковка даты-времени и развертва в таймштамп 
:(
    Опции темы
IgnisFatuus
Дата 21.7.2015, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Доброго дня! Занимаюсь тут изучением библиотеки FatFS и наткнулся на проблему - дата и время там хранятся в своем формате, есть double word переменная 16 бит даты и 16 бит со временем.

Код

bit31:25
Year origin from the 1980 (0..127)
bit24:21
Month (1..12)
bit20:16
Day of the month(1..31)
bit15:11
Hour (0..23)
bit10:5
Minute (0..59)
bit4:0
Second / 2 (0..29)


Накидал тут простенькую программку, чтобы глянуть - а правильно будет время обрабатываться потом - вот что получилось :

Код

#include <iostream>
#include <string.h>

typedef unsigned long    DWORD;
typedef unsigned short    WORD;

int main() {


    time_t t = time(NULL);
    struct tm tm_ = *localtime(&t);
    WORD date;
    WORD time;

    DWORD variable = ((DWORD)(tm_.tm_year - 80) << 25)
                   | (((DWORD)tm_.tm_mon + 1) << 21)
                   | ((DWORD)tm_.tm_mday << 16)
                   | ((DWORD)tm_.tm_hour << 11)
                   | ((DWORD)tm_.tm_min << 5)
                   | ((DWORD)((tm_.tm_sec >> 1)));

    memcpy(&time, &variable, sizeof(time));

    date = (variable>> 16);

    std::cout << "time = " << time << std::endl;
    std::cout << "date = " << date << std::endl;

    tm last_mod;
    last_mod.tm_year = (((date & 0xFE00) >> 9) + 80);
    last_mod.tm_mon = ((date & 0x1E0) >> 5);
    if(last_mod.tm_mon != 0) last_mod.tm_mon -=1;
    last_mod.tm_mday = ((date & 0x1F));

    int result_s = (((int)time & (int)0xF800) >> 11);
    last_mod.tm_hour = (unsigned)result_s;

    last_mod.tm_min = ((time & 0x7E0) >> 5);
    last_mod.tm_sec = ((time & 0x1F));


    std::cout << "create TS   " << mktime(&tm_) << std::endl;
    std::cout << "restored TS " <<   mktime(&last_mod) << std::endl;
    return 0;
}


вывод -
 time = 27725
date = 18165
create TS    1437474866
restored TS 1437471253



как видно - ТS не совпадают. Что я делаю не так?
PM MAIL   Вверх
feodorv
Дата 21.7.2015, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(IgnisFatuus @  21.7.2015,  13:46 Найти цитируемый пост)
   memcpy(&time, &variable, sizeof(time));

Почему не просто:
Код
time = (WORD) variable;
???


Цитата(IgnisFatuus @  21.7.2015,  13:46 Найти цитируемый пост)
    last_mod.tm_sec = ((time & 0x1F));

Секунды должны быть умножены на два. Или << 1.


Цитата(IgnisFatuus @  21.7.2015,  13:46 Найти цитируемый пост)
Что я делаю не так? 

Где инициализация поля tm_isdst? Если отбросить недоразумение с секундами, то у Вас отличие "create TS" от "restored TS" на один час (3600 секунд).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.