Форум сайта python.su
Есть 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
a = np.fromfile(f, dtype=np.float32)
9.33678148247e-313 2.12199581073e-314 2.61854792296e-322 3.60739284461e-312 nan
Отредактировано kristus (Июнь 10, 2016 16:14:02)
Офлайн
nan - это наверное отрицательное число.наверное было бы правильно посмотреть руками чт там именно за значение и от талкиваться от результата?
Офлайн
Полагаю, вам должны помочь библиотеки binascii и struct
Офлайн
kristus
Если так:
a = np.fromfile(f, dtype=np.float32)
то выводятся значения типа:
9.33678148247e-313
FishHook
Полагаю, вам должны помочь библиотеки binascii и struct
Офлайн
doza_andВот тут не понял что вы имеете ввиду? Там же старший бит - знаковый.
Понимать что обычный float не бывает отрицательный или положительной
Офлайн
PooHЯ имел ввиду что в приведенном стандарте нет такого формата что этого бита нет. Т.е. нет формата для только положительных плавающих(это я так перевел дробных) чисел.
Вот тут не понял что вы имеете ввиду? Там же старший бит - знаковый.
Офлайн
doza_and
Не может этого быть. Приводите код который вы использовали.
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
Офлайн
kristusВот так лучше. А то вы просто всех обманываете.
Значение 9.33678148247e-313 если float64
если float32 тогда будет 9.3887e-44
kristusВ каком смысле подходящий? Из любого файла при таком подходе целые числа получаются. Если оно совпадает с искомыми данными, то в файл просто не записаны дробные части, и вы их там никогда не найдете.
int32 самый подходящий вариант, но без дробной части((
kristusКакой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе.
читающая из него написана на c++ (возможно ф-ей fmOpenRead).
Отредактировано doza_and (Июнь 13, 2016 09:52:24)
Офлайн
doza_andНо все же и я попытаюсь вас уверить, что такая фукнция все же присутствует в с++ борландском. По поводу подходящего варианта, значит что значение те которые нужно но int. За время писать не нужно было это лишняя информация. Хорошо конечно быть умным и много знать в каком языке и какая функция присутствует, и что еще можно здесь тыкать из кусков если и так в программе 2 строчки! Согласен, что мат часть здесь играет самую важную роль и я же не прошу решения интересно по косточкам разобрать и прийти к решению.
Какой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе
Офлайн
kristusВы показали 36 байт из начала файла, каким значениям они соответствуют? что показывает ваша программа на c++(и дату и время тоже не забудьте написать)?
4772186
1088734208
262
95
53
31
136
0
4294967288
kristusЭто ни разу не лишняя информация, в зависимости от того как были сериализованы дата и время они могут занимать разное кол-во байт в начале файла, а ведь их надо пропустить перед тем как считывать данные. И если пропустить неверное кол-во байт, то мы будет уже считывать значения мимо их границ, т.е., скажем, два байта из одного значения, а два из другого.
За время писать не нужно было это лишняя информация.
Офлайн