Найти - Пользователи
Полная версия: Из HEX в Float
Начало » Python для экспертов » Из HEX в Float
1 2 3
kristus
Есть hex файл в котором хранятся дробные положительные о отрицательные числа. Как мне считать их?
Пробовал использовать Numpy:
import numpy as np
f = open("NV_6_7_full.dbo", "rb")
a = np.fromfile(f, dtype=np.int32)    
for i in a:
     print i
    
Выводятся и положительные и отрицательные числа, но integer. Если так:
a = np.fromfile(f, dtype=np.float32) 
 
то выводятся значения типа:
9.33678148247e-313
2.12199581073e-314
2.61854792296e-322
3.60739284461e-312
nan
nan - это наверное отрицательное число.
Подскажите, мож кто-то знает преобразовать значения в положительный и отрицательный float? Спасибо!
ZerG
nan - это наверное отрицательное число.
наверное было бы правильно посмотреть руками чт там именно за значение и от талкиваться от результата?
FishHook
Полагаю, вам должны помочь библиотеки binascii и struct
doza_and
kristus
Если так:
a = np.fromfile(f, dtype=np.float32)
то выводятся значения типа:
9.33678148247e-313

Не может этого быть. Приводите код который вы использовали.

FishHook
Полагаю, вам должны помочь библиотеки binascii и struct

Думаю тут гораздо полезнее прочитать https://ru.wikipedia.org/wiki/IEEE_754-2008. Это позволит не тыкаться как котенку вслепую, а понимать как происходит преобразование. Понимать что обычный float не бывает отрицательный или положительной, понимать что такое nan, inf, qnan.

Вообще перебрав все типы numpy вы возможно получите результат. Но нет никакой гарантии что в вашем файле нет заголовка, ну например 13 байт. Тогда вы никогда не получите желаемого. Надо понимать как выглядят в двоичном виде небольшие плавающие числа.
.
PooH
doza_and
Понимать что обычный float не бывает отрицательный или положительной
Вот тут не понял что вы имеете ввиду? Там же старший бит - знаковый.
doza_and
PooH
Вот тут не понял что вы имеете ввиду? Там же старший бит - знаковый.
Я имел ввиду что в приведенном стандарте нет такого формата что этого бита нет. Т.е. нет формата для только положительных плавающих(это я так перевел дробных) чисел.

По уму ТС может прицепить файл к сообщению и ему может и подскажут что то такое.
kristus
doza_and
Не может этого быть. Приводите код который вы использовали.

Значение 9.33678148247e-313 если float64
если float32 тогда будет 9.3887e-44

Вот код:
import numpy as np
f = open("NV_6_7_full.dbo", "rb")
f9 = open("nv_float_6_7_full.dbo", "wt")
a = np.fromfile(f, dtype=np.float32)    
for i in a:
    f9.write(str(i))
    f9.write("\n")
Результат:
6.68726e-39
7.14893
3.6714e-43
1.33123e-43
7.42688e-44
4.34403e-44
1.90577e-43
0.0
nan
Результат чтения из того же файла но только
a = np.fromfile(f, dtype=np.int32)  
:

4772186
1088734208
262
95
53
31
136
0
-8
np.fromfile(f, dtype=np.uint32)
:
4772186
1088734208
262
95
53
31
136
0
4294967288
Первые два значение - это датавремя остальные данные. int32 самый подходящий вариант, но без дробной части((
Программа создающая файл и записывающая данные а также читающая из него написана на c++ (возможно ф-ей fmOpenRead). Данные читаются и отображаются корректно даже float значения.
doza_and
kristus
Значение 9.33678148247e-313 если float64
если float32 тогда будет 9.3887e-44
Вот так лучше. А то вы просто всех обманываете.

Откуда вы знаете что должно получиться? Может вы знаете конкретные значения? Тогда их можно найти в файле и читать его с заданного места.
kristus
int32 самый подходящий вариант, но без дробной части((
В каком смысле подходящий? Из любого файла при таком подходе целые числа получаются. Если оно совпадает с искомыми данными, то в файл просто не записаны дробные части, и вы их там никогда не найдете.

Что за дата время. Вы явно не всю доступную вам информацию о файле выложили.

kristus
читающая из него написана на c++ (возможно ф-ей fmOpenRead).
Какой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе.
Задача считать данные из файла решается за 2 минуты. Вы тут уже второй день переписываетесь. Может вам просто за денежку попросить специалиста вам данные считать?
kristus
doza_and
Какой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе
Но все же и я попытаюсь вас уверить, что такая фукнция все же присутствует в с++ борландском. По поводу подходящего варианта, значит что значение те которые нужно но int. За время писать не нужно было это лишняя информация. Хорошо конечно быть умным и много знать в каком языке и какая функция присутствует, и что еще можно здесь тыкать из кусков если и так в программе 2 строчки! Согласен, что мат часть здесь играет самую важную роль и я же не прошу решения интересно по косточкам разобрать и прийти к решению.
PooH
kristus
4772186
1088734208
262
95
53
31
136
0
4294967288
Вы показали 36 байт из начала файла, каким значениям они соответствуют? что показывает ваша программа на c++(и дату и время тоже не забудьте написать)?
kristus
За время писать не нужно было это лишняя информация.
Это ни разу не лишняя информация, в зависимости от того как были сериализованы дата и время они могут занимать разное кол-во байт в начале файла, а ведь их надо пропустить перед тем как считывать данные. И если пропустить неверное кол-во байт, то мы будет уже считывать значения мимо их границ, т.е., скажем, два байта из одного значения, а два из другого.

начало вашего файла вот(если только порядок байт на вашей и моей машине совпадает)
5A D1 48 00 00 C4 E4 40 06 01 00 00 5F 00 00 00 35 00 00 00 1F 00 00 00 88 00 00 00 00 00 00 00 F8 FF FF FF
покажите каким данным оно соответствует и я попробую определить формат хранения
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB