|
|
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Имеется некий бинарный файл, в котором в определенном порядке содержатся числовые данные, как извлечь эти данные в нормальный десятичний формат средствами FoxPro (VFP8). Формат файла: Первые 144 байта всякая лабуда Далее записаны данные блоками по 40 байт 4 байта целое число (INTEGER) 4 х 8 байт числа с плавающей точкой (DOUBLE) 4 байта целое число (INTEGER) Например в одном из блоков есть такие числа и известно их десятичное значение 98 6E 12 83 C0 CA E3 3F = 0,6200 BD E3 14 1D C9 E5 E3 3F = 0,6185 Как получить эти значения в десятичном формате, считывая данные из файла??? Вот мои попытки STORE FOPEN('имя файла') TO gnFileHandle && Открываем файл для чтения STORE FSEEK(gnFileHandle, 156) TO gnTop && Ставим указатель в нужную позицию gcString = STRCONV((FREAD(gnFileHandle, 8)),15 ) && Считываем 8 байт в Hex-виде в && переменную *Получаем переменную gcString = “BDE3141DC9E5E33F” *Конвертируем для того, чтобы младшие байты поставить в начало (а нужно ли это?...) b1=SUBSTR(gcString,15,2) b2=SUBSTR(gcString,13,2) b3=SUBSTR(gcString,11,2) b4=SUBSTR(gcString,9,2) b5=SUBSTR(gcString,7,2) b6=SUBSTR(gcString,5,2) b7=SUBSTR(gcString,3,2) b8=SUBSTR(gcString,1,2) gcNew=b1+b2+b3+b4+b5+b6+b7+b8 *Получаем переменную gcNew = “3FE3E5C91D14E3BD”, т.е. перевернутую gcString gcOut=ALLTRIM(STR(EVALUATE("0x"+ALLTRIM(gcNew)))) *Получаем строковое выражение десятичного значения переменной gcNew. *Вот тут и начинаются сложности. Такое решение работает для считывания целых *(четырехбайтных) чисел. А вот для DOUBLE – фигвам… ? gcString ? gcNew ? gcOut = FCLOSE(gnFileHandle) && Close the file ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 12:58 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
NikolosИмеется некий бинарный файл, в котором в определенном порядке содержатся числовые данные, как извлечь эти данные в нормальный десятичний формат средствами FoxPro (VFP8). Формат файла: Первые 144 байта всякая лабуда Далее записаны данные блоками по 40 байт 4 байта целое число (INTEGER) 4 х 8 байт числа с плавающей точкой (DOUBLE) 4 байта целое число (INTEGER) Например в одном из блоков есть такие числа и известно их десятичное значение 98 6E 12 83 C0 CA E3 3F = 0,6200 BD E3 14 1D C9 E5 E3 3F = 0,6185 Как получить эти значения в десятичном формате, считывая данные из файла??? Вот мои попытки STORE FOPEN('имя файла') TO gnFileHandle && Открываем файл для чтения STORE FSEEK(gnFileHandle, 156) TO gnTop && Ставим указатель в нужную позицию gcString = STRCONV((FREAD(gnFileHandle, 8)),15 ) && Считываем 8 байт в Hex-виде в && переменную *Получаем переменную gcString = “BDE3141DC9E5E33F” *Конвертируем для того, чтобы младшие байты поставить в начало (а нужно ли это?...) b1=SUBSTR(gcString,15,2) b2=SUBSTR(gcString,13,2) b3=SUBSTR(gcString,11,2) b4=SUBSTR(gcString,9,2) b5=SUBSTR(gcString,7,2) b6=SUBSTR(gcString,5,2) b7=SUBSTR(gcString,3,2) b8=SUBSTR(gcString,1,2) gcNew=b1+b2+b3+b4+b5+b6+b7+b8 *Получаем переменную gcNew = “3FE3E5C91D14E3BD”, т.е. перевернутую gcString gcOut=ALLTRIM(STR(EVALUATE("0x"+ALLTRIM(gcNew)))) *Получаем строковое выражение десятичного значения переменной gcNew. *Вот тут и начинаются сложности. Такое решение работает для считывания целых *(четырехбайтных) чисел. А вот для DOUBLE – фигвам… ? gcString ? gcNew ? gcOut = FCLOSE(gnFileHandle) && Close the file Ну, это Вы поторопились... И, скорее всего, средствами Фокса этого сделать нельзя... Здесь нужны низкоуровневые преобразования, которые Фоксу недоступны - ведь он разрабатывался несколько для других целей и не является универсальным(!) языком системного(!) программирования (типа ассемблера или С++)... Например, отрицательные числа (целые) хранятся в "дополнительном виде", т.е. как разница между 0xFFF(F) и 0x<16-ричное число>; числа типа double могут храниться как (мантисса)+(степень 10) и т.д. Самым простым решением в данном случае будет написание библиотеки (например, в виде dll) на С++ (все "преобразования" будут проводиться автоматически во время закачки данных в переменные) и ее подключение к Вашей программе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:14 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за ответ, я так и подозревал. Но вот только теперь возникла еще большая проблема. С языком С я совсем не дружу и dll сварганить - непреодолимое препятствие... Может кто решал подобную задачу, помогите, очень нужно.... Пожалуйста.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:28 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Станислав C. Например, отрицательные числа (целые) хранятся в "дополнительном виде", т.е. как разница между 0xFFF(F) и 0x<16-ричное число>; числа типа double могут храниться как (мантисса)+(степень 10) и т.д. Самым простым решением в данном случае будет написание библиотеки (например, в виде dll) на С++ (все "преобразования" будут проводиться автоматически во время закачки данных в переменные) и ее подключение к Вашей программе... Мне кажется, можно это сделать и на фоксе, только надо определиться, как же хранятся в файле эти числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:32 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Может проще начать с того, откуда там пояляются эти числа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:35 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Не похоже эти значение на тип DOUBLE используемый в FoxPro. Пример преобразования для FoxPro можно посмотреть здесь http://forum.foxclub.ru/read.php?f=5&i=104410&t=104361 Число 0.6200 должно выглядеть так D7 A3 70 3D 0A D7 E3 3F ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:36 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
http://pascal.sources.ru/datatype/floatype.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 13:47 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
ага перегонял я как-то парадоксовскую базу на фокс ручками было было такое угу перегнал только местами буковки не те были и удаленные записи подобрал но это поправимо было у меня как бы числа целые были но было поле дата тоже я Вам скажи тот еще презент А потом я дотумкал что есть ОДБС драйвера вот смеху то было, но как я с датой мучился запомню навсегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 14:00 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
При использовании для конвертации API-функций (по ссылке) получается Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 14:52 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Большое всем спасибо за помощь !!!!!!! Проблема решилась по вашей подсказке. Может кому пригодится: DECLARE INTEGER RtlMoveMemory IN WIN32API AS Str2Double ; DOUBLE@, STRING@, INTEGER STORE FOPEN(‘имя файла') TO gnFileHandle STORE FSEEK(gnFileHandle, 148) TO gcString = FREAD(gnFileHandle, 8) b1=CHR(ASC(ALLTRIM(SUBSTR(gcString,1,1)))) b2=CHR(ASC(ALLTRIM(SUBSTR(gcString,2,1)))) b3=CHR(ASC(ALLTRIM(SUBSTR(gcString,3,1)))) b4=CHR(ASC(ALLTRIM(SUBSTR(gcString,4,1)))) b5=CHR(ASC(ALLTRIM(SUBSTR(gcString,5,1)))) b6=CHR(ASC(ALLTRIM(SUBSTR(gcString,6,1)))) b7=CHR(ASC(ALLTRIM(SUBSTR(gcString,7,1)))) b8=CHR(ASC(ALLTRIM(SUBSTR(gcString,8,1)))) lcBinary = b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 lnDouble = 0.0000 Str2Double(@lnDouble, @lcBinary, 8) ? m.lnDouble = FCLOSE(gnFileHandle) && Close the file **************************************************** Или в таком виде: DECLARE INTEGER RtlMoveMemory IN WIN32API AS Str2Double ; DOUBLE@, STRING@, INTEGER lcHeh="BDE3141DC9E5E33F" && BDE3141DC9E5E33F 0.6218 && 986E1283C0CAE33F 0.6185 b1=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,1,2))) b2=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,3,2))) b3=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,5,2))) b4=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,7,2))) b5=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,9,2))) b6=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,11,2))) b7=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,13,2))) b8=EVALUATE("0x"+ALLTRIM(SUBSTR(lcHeh,15,2))) lcBinary = CHR(b1) + CHR(b2) + CHR(b3) + CHR(b4) + ; CHR(b5) + CHR(b6) + CHR(b7) + CHR(b8) lnDouble = 0.0000 Str2Double(@lnDouble, @lcBinary, 8) ? m.lnDouble ********************************************************** Да, и еще приношу свои извинения, в первом посте была допущена ошибка 98 6E 12 83 C0 CA E3 3F = 0,6185 BD E3 14 1D C9 E5 E3 3F = 0,6218 не туда посмотрел............. Еще раз спасибо - спасли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2005, 15:26 |
|
||
|
Помогите пожалуйста прочитать DOUBLE...
|
|||
|---|---|---|---|
|
#18+
Hi Nikolos! Кстати говоря, в VFP9 конвертацию double сделали через "родную" функцию CTOBIN() Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 03:54 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=193&tid=1589098]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 304ms |

| 0 / 0 |
