Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 10, 2016 16:12:53

kristus
Зарегистрирован: 2012-10-27
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Из HEX в Float

Есть 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? Спасибо!

Отредактировано kristus (Июнь 10, 2016 16:14:02)

Офлайн

#2 Июнь 10, 2016 16:25:10

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2584
Репутация: +  60  -
Профиль   Отправить e-mail  

Из HEX в Float

nan - это наверное отрицательное число.
наверное было бы правильно посмотреть руками чт там именно за значение и от талкиваться от результата?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Июнь 10, 2016 19:35:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Из HEX в Float

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



Офлайн

#4 Июнь 10, 2016 21:48:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Из HEX в Float

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 байт. Тогда вы никогда не получите желаемого. Надо понимать как выглядят в двоичном виде небольшие плавающие числа.
.



Офлайн

#5 Июнь 12, 2016 07:40:27

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Из HEX в Float

doza_and
Понимать что обычный float не бывает отрицательный или положительной
Вот тут не понял что вы имеете ввиду? Там же старший бит - знаковый.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Июнь 12, 2016 08:17:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Из HEX в Float

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

По уму ТС может прицепить файл к сообщению и ему может и подскажут что то такое.



Офлайн

#7 Июнь 13, 2016 09:11:20

kristus
Зарегистрирован: 2012-10-27
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Из HEX в Float

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 значения.

Офлайн

#8 Июнь 13, 2016 09:39:42

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Из HEX в Float

kristus
Значение 9.33678148247e-313 если float64
если float32 тогда будет 9.3887e-44
Вот так лучше. А то вы просто всех обманываете.

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

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

kristus
читающая из него написана на c++ (возможно ф-ей fmOpenRead).
Какой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе.
Задача считать данные из файла решается за 2 минуты. Вы тут уже второй день переписываетесь. Может вам просто за денежку попросить специалиста вам данные считать?



Отредактировано doza_and (Июнь 13, 2016 09:52:24)

Офлайн

#9 Июнь 13, 2016 10:49:22

kristus
Зарегистрирован: 2012-10-27
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Из HEX в Float

doza_and
Какой c++ #!@!! fmOpenRead это паскалевская функция. Не обижайтесь пожалуйста, но складывается впечатление что вы пробуете решить вашу задачу методом тыка и комбинирования непонятных вам кусков. Смею вас уверить очень может быть что так вы вообщ не получите результата при таком подходе
Но все же и я попытаюсь вас уверить, что такая фукнция все же присутствует в с++ борландском. По поводу подходящего варианта, значит что значение те которые нужно но int. За время писать не нужно было это лишняя информация. Хорошо конечно быть умным и много знать в каком языке и какая функция присутствует, и что еще можно здесь тыкать из кусков если и так в программе 2 строчки! Согласен, что мат часть здесь играет самую важную роль и я же не прошу решения интересно по косточкам разобрать и прийти к решению.

Офлайн

#10 Июнь 13, 2016 11:15:43

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Из HEX в Float

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
покажите каким данным оно соответствует и я попробую определить формат хранения



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version