powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите пожалуйста прочитать DOUBLE...
12 сообщений из 12, страница 1 из 1
Помогите пожалуйста прочитать DOUBLE...
    #33128687
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
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128725
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) на С++ (все "преобразования" будут проводиться автоматически во время закачки данных в переменные) и ее подключение к Вашей программе...
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128762
Nikolos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответ, я так и подозревал.
Но вот только теперь возникла еще большая проблема.
С языком С я совсем не дружу и dll сварганить - непреодолимое препятствие...

Может кто решал подобную задачу, помогите, очень нужно.... Пожалуйста..
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128778
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав C.
Например, отрицательные числа (целые) хранятся в "дополнительном виде", т.е. как разница между 0xFFF(F) и 0x<16-ричное число>; числа типа double могут храниться как (мантисса)+(степень 10) и т.д.
Самым простым решением в данном случае будет написание библиотеки (например, в виде dll) на С++ (все "преобразования" будут проводиться автоматически во время закачки данных в переменные) и ее подключение к Вашей программе...
Мне кажется, можно это сделать и на фоксе, только надо определиться, как же хранятся в файле эти числа.
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128793
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может проще начать с того, откуда там пояляются эти числа?
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128801
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не похоже эти значение на тип 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
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128843
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://pascal.sources.ru/datatype/floatype.htm
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33128899
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага перегонял я как-то парадоксовскую базу на фокс ручками
было было такое угу
перегнал только местами буковки не те были и удаленные записи подобрал но это поправимо было
у меня как бы числа целые были но было поле дата тоже я Вам скажи тот еще презент
А потом я дотумкал что есть ОДБС драйвера вот смеху то было, но как я с датой мучился запомню навсегда
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33129083
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При использовании для конвертации API-функций (по ссылке) получается

Код: plaintext
1.
2.
98 6E 12 83 C0 CA E3 3F = 0,6185
BD E3 14 1D C9 E5 E3 3F = 0,6218
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33129214
Nikolos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое всем спасибо за помощь !!!!!!!
Проблема решилась по вашей подсказке.

Может кому пригодится:

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

не туда посмотрел.............

Еще раз спасибо - спасли.
...
Рейтинг: 0 / 0
Помогите пожалуйста прочитать DOUBLE...
    #33130172
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Nikolos!

Кстати говоря, в VFP9 конвертацию double сделали через "родную" функцию CTOBIN()

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите пожалуйста прочитать DOUBLE...
    #34618772
Виктор В
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи!
Столкнулся с похожей проблемой, только нужно преобразовывать из Double и обратно на VisualBasicApplication для Excel. На FoxPro8 у меня тоже получилось, а вот в VBA...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите пожалуйста прочитать DOUBLE...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]