Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Декодирование сжатого формата даты ?!?!?   Найти похожие ветки 

 
firefox   (2003-06-25 12:41) [0]

У меня следующая проблема... Некая фирма поставила ПО под ДОС на Clipper-е... использует dbf... но не совсем обычно.... все данные представляющие дату преобразуються к типу Character длинною 2 символа.... мне же из программы на ObjPascal (D6) необходимо читать эти даты... запросил у конторы алгоритм декодирования:

Для "распаковки" дат "упакованного" формата из наших файлов необходимо воспользоваться следующим алгоритмом:

1. строка представляющая упакованную дату приводится к переменной типа WORD.
(через указатель на память и приведение типов)

2. в полученном числе байты переставляются местами.

3. данное число есть число дней от 01/01/1900 года. Т.е. к 01/01/1900
прибавляется полученное число и на выходе получаете распакованную дату.


Не совсем понимаю что имелось ввиду в п.1... может кто сталкивался или кого нить озарит... Спасибо.


 
Johnmen ©   (2003-06-25 12:58) [1]

А что тут не понять ? Не строка это, а последовательность из 2-ух байтов, то есть word.
Про упаковку дат таким образом было описано еще в доках по TurboPascal


 
firefox   (2003-06-25 13:03) [2]

Хорошо.... для тупых (меня) каким образом выполняеться п.1.. (в примере можно? а то у меня фигня получаеться.... :()

и нафига разменивать байты?


 
sniknik ©   (2003-06-25 13:04) [3]

судя по всему подложили тебе больщую свинью... ;о)

не их с алгоритмом все понятно, но в вариантах где дата одним байтом совпадет по значению #32, #0 не получиш истинную дату строка обрежется или ее совсем не будет (первый байт). также проблема будет если используеш Langdriver, фактически нельзя его использовать :(. т.е. даты будут или пропадать или совсем другие. решения в зависимости от движка базы может и не быть вовсе.

что до алгоритма то он довольно прост

var st: string[2];
wd: word absolute st[1];
GodData: TDateTime;
begin
st:= FieldByname("BadData").AsString;
GodData:= StrToDate(01/01/1900)+wd;

примерно так, не учитывая ограничений и всей остальной пое%№ни. сочуствую.
p.s. найди компонент (или сам пиши), который может давать значения полей as is, без этого все бессмысленно.


 
HSolo ©   (2003-06-25 14:34) [4]

А зачем искать-то? Есть же BDE с его API
DbiGetRecord и иже с ним


 
sniknik ©   (2003-06-25 14:54) [5]

HSolo © (25.06.03 14:34)
наверное подойдет, надо посмотреть только как он возвращает, и наверное удобнее использовать DbiGetField.

сам я Halcyon использую, с BDE почти не сталкиваюсь, поэтому всех возможностей не знаю. но если он действительно так работает как предполагаем (as is), то все, проблем нет.



Страницы: 1 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
14-55731
NailMan
2003-07-01 18:13
2003.07.17
А как вы относитесь к идее распределенных вычислений?


4-55887
DmitryDDR
2003-05-15 07:40
2003.07.17
CreateProcessWithLogonW


14-55854
Alex_x
2003-07-02 10:31
2003.07.17
Как получать деньги за программы с запада


1-55539
Sheng
2003-07-02 23:20
2003.07.17
Реестр


1-55555
AndrewVolkov
2003-07-06 22:20
2003.07.17
Popupmenu в runtime