powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как прочитать 4 байта как float?
8 сообщений из 8, страница 1 из 1
как прочитать 4 байта как float?
    #39912930
admpos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Читаю бинарный файл. Очередной блок - 4 байта, которые нужно перевести во float. Fox v9 через ctobin(fread(hfile, 4), '4RS') отлично переводит в integer, а как во float - до меня не доходит.
С примерами выглядит так. Hex: 30 A6 F7 40; int: 1089971760; нужный float: 7.739037.
Как вариант - перевести во float не hex, а уже вот этот int.
Подскажите плиз, в какую сторону вообще смотреть. Может, у фокса есть встроенная функция? Заранее спасибо :)
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39912946
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Встроенных функций нет. Проще всего написать на С такую функцию и вызывать ее из DLL.

Можно заморочиться переводном из int. Структура float
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39912999
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Накидал по-быстрому, вроде работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
proc ToFloat
lpara tcN
local lnI, lnM, lnP
lnI = ctobin(tcN, '4RS')
lnM = bitand(lnI, 8388607) + 8388608 && Мантисса
lnP = bitrshift(lnI, 23) - 127 && Порядок
if lnP > 255 && отрицательное
	lnM = -lnM
	lnP = lnP - 256
endif
return lnM * (2^(lnP - 23))



Пользоваться так
Код: sql
1.
? ToFloat(chr(48) + chr(166) + chr(247) + chr(64)) && Hex: 30 A6 F7 40
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39913184
admpos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, спасибо, работает! :)

споткнулось на одном значении: F42576BF -> -0.9615166
т.е. должно быть вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
proc ToFloat
lpara tcN
local lnI, lnM, lnP
lnI = ctobin(tcN, '4RS')
lnM = bitand(lnI, 8388607) + 8388608 && Мантисса
lnP = bitrshift(lnI, 23) - 127 && Порядок
if lnP >= 255 && отрицательное
	lnM = -lnM
	lnP = lnP - 256
endif
return lnM * (2^(lnP - 23))
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39913212
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл что 127 вычитается, правильно так
Код: sql
1.
if lnP > 128 && отрицательное


т.к. для отрицательного bitrshift(lnI, 23) минимум 256, а 256-127=129
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39926210
admpos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, конечно, понимаю, что это наглость с моей стороны, но все равно рискну :)
Можно попросить такую же функцию, только в обратную сторону? float -> hex. Заранее спасибо!
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39926549
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На фоксе писать долго. В аттаче dll, используй ее.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
* Объявление достаточно один раз сделать
declare double int2float in int2float.dll integer
declare integer float2int in int2float.dll double

*  Использование
lnF = int2float(ctobin(chr(48) + chr(166) + chr(247) + chr(64), '4RS'))
? lnF
lnI = float2int(lnF)
? transform(lnI, '@0') && или bintoc(lnI, '4RS')
...
Рейтинг: 0 / 0
как прочитать 4 байта как float?
    #39926747
admpos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как прочитать 4 байта как float?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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