Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2008, 13:26   #1
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию формат упакованного времени в DELPHI

Есть запись:
20 2E D8 82 2D CE 47 E3 40
В ней полность запакована дата: 08.02.2008 и время: 10.38
плюс минус минута, возможно еще секунды или милисекунды.
Помогите расшифровать...
dimonbest вне форума Ответить с цитированием
Старый 08.02.2008, 13:57   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

20 - это пробел
2E D8 82 2D CE 47 E3 40 - это TDateTime = Double - 8 байт

это действительно 08.02.2008 10:38:00

целая часть Double - дни от (не помню какой) начальной даты
дробная часть - время. Подробнее см. в F1
alexBlack вне форума Ответить с цитированием
Старый 08.02.2008, 17:59   #3
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Вот 6 записей; первая за сегодня, примерно 16.18, а остальные с интервалом в 1 минуту
20 BC BB BB BB D5 47 E3 40
20 C1 16 6C C1 D5 47 E3 40
20 C7 71 1C C7 D5 47 E3 40
20 CD CC CC CC D5 47 E3 40
20 D2 27 7D D2 D5 47 E3 40
20 D8 82 2D D8 D5 47 E3 40
Если мы первый байт (20) уберем, и остальные 8 разделим пополам, то увидим, что изменяются 4 байта, но количество часов то одинаковое (16) и что то должно то быть одинаковым...
Помогите...
dimonbest вне форума Ответить с цитированием
Старый 08.02.2008, 21:37   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вот пример для первой строчки
Код:
procedure TForm1.FormCreate(Sender: TObject);
type
   TD = record
      A : array [1..8] of byte;
   end;
var D:TDateTime;
    D1, M1, Y1:word;
    H1, M2, S2, S3 : word;
begin
   TD(D).A[1] := $BC;
   TD(D).A[2] := $BB;
   TD(D).A[3] := $BB;
   TD(D).A[4] := $BB;
   TD(D).A[5] := $D5;
   TD(D).A[6] := $47;
   TD(D).A[7] := $E3;
   TD(D).A[8] := $40;
   decodeDate(D, D1, M1, Y1);       // 2008 2 8
   decodeTime(D, H1, M2, S2, S3);   // 16 : 18 : 0 : 0
end;
alexBlack вне форума Ответить с цитированием
Старый 09.02.2008, 10:47   #5
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Спасибо огромное, ВЫ ГЕНИЙ!
Уже месяц пытаюсь расшифровать эту запись, и никак...
P.S. В DELPHI не силен, начал изучать его не сильно давно...
dimonbest вне форума Ответить с цитированием
Старый 09.02.2008, 13:10   #6
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

А есть ли функция, которая проверят TDatetime на валидность, а то если формат неверный, то при
decodeDate(D, Y1, M1, D1);
появляется ошибка, и программа вылетает...
Мне нужно проверять базу данных, которая состоит из списка записей, которые я привел выше, на валидность. Удалять неккоректные записи.
Алгоритм и програмку написал, стал играться с базой, делая неверные записи, и програмка стала вылетать...
dimonbest вне форума Ответить с цитированием
Старый 09.02.2008, 15:14   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Отдельной функции нет. Да и не нужно. Во первых не трудно проверить правильность значений обычными if. Во-вторых можно отлавливать исключения

DataOk := true
try
decodeDate(...
except
DataOk := false
end
alexBlack вне форума Ответить с цитированием
Старый 09.02.2008, 15:20   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

А еще лучше покапаться и почитать статейки разные... и самому реализовать на низком уровне
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 15:28   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Согласен, почитать всегда полезно. Даже если не дойдет до практической реализации
alexBlack вне форума Ответить с цитированием
Старый 09.02.2008, 20:12   #10
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Отдельной функции нет. Да и не нужно. Во первых не трудно проверить правильность значений обычными if. Во-вторых можно отлавливать исключения

DataOk := true
try
decodeDate(...
except
DataOk := false
end
Не получилось.
Во-первых написало предупреждение, что переменная DataOk (я ее обьявил локально как булен) не используется.
И снова программу выбивает не месте decode.
А как проверить правильность переменной командой IF? Переменная D типа TDateTime: double...
P.S.книжки по чуть чуть читаю, но не все получается найти...
dimonbest вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формат даты разняться в Delphi Cantana Помощь студентам 4 28.04.2008 09:16
Изменение упакованного exe Marsik Софт 5 28.01.2008 10:30
формат картинки AndrewASV Общие вопросы Delphi 3 23.09.2007 12:45
SOL-запрос интервала даты и времени в Delphi DENIS_ БД в Delphi 5 23.12.2006 12:55