Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 6, 2010 00:07:12

arikitik
От:
Зарегистрирован: 2009-12-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с чтением бинарных файлов

Есть файл, строгой структуры, в котором записан, в том числе массив данных в формате 4-byte IBM floating point. При помощи модуля struct я получаю значения, но они отличаются от действительных. При визуализации получается график такого же вида, как правильный, но амплитуды другие. Подскажите, в чём может быть проблема.

фрагмент кода

fname = sys.argv
sgy = open(fname, ‘rb’)

sgy.seek(3212)
traces = struct.unpack('>h', sgy.read(2))
sgy.seek(3220)
samples = struct.unpack('>h',sgy.read(2))

data = np.zeros(samples*traces)
data = data.reshape(120,5000)

sgy.seek(3600)
for x in range(traces):
sgy.seek(sgy.tell()+240)
for y in range(samples):
data = struct.unpack('>f',sgy.read(4))

sgy.close()



Офлайн

#2 Янв. 6, 2010 20:33:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

проблема с чтением бинарных файлов

Насколько я смог понять, IBM floating point несколько отличается от IEEE-754 floating point (последняя используется сопроцессором вообще и Питоном в частности).
Для 32 битного числа имеем:
IEEE-754: Sign bit: 1 bit, Exponent width: 8 bits, Significand precision: 24 (23 explicitly stored)
IBM: Sign - 1bit, exponent: 6 bits, mantissa: 25 bit
Экспонента на 2 бита короче, а мантиса соответственно длиннее.

Модуль struct вам не поможет - ищите или пишите преобразование специально для IBM формата.



Офлайн

#3 Янв. 7, 2010 02:08:18

arikitik
От:
Зарегистрирован: 2009-12-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с чтением бинарных файлов

печально(( спасибо за разъяснение!



Офлайн

#4 Янв. 7, 2010 04:18:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

проблема с чтением бинарных файлов

Не очень-то и печально.
Смотрите:
- ibm формат http://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture
- аналогичный IEEE-754 http://en.wikipedia.org/wiki/Single_precision_floating-point_format

Питон работает с double (процессор, грубо говоря, тоже). Т.е. можно развернуть IBM-32 в IEEE double без потери точности
Это - наш стандарт: http://en.wikipedia.org/wiki/Double_precision_floating-point_format
берем и побитово переносим из ibm в ieee. Экспонента дополняется старшим битом слева, а мантисса нулем справа.

Когда все заработает - можно быстро перенести код на Cython для более или менее приличной производительности.

Вот кусок на С, который делает то же самое судя по описанию.
http://bytes.com/topic/c/answers/221981-c-code-converting-ibm-370-floating-point-ieee-754-a



Отредактировано (Янв. 7, 2010 05:12:53)

Офлайн

#5 Янв. 7, 2010 21:12:57

arikitik
От:
Зарегистрирован: 2009-12-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с чтением бинарных файлов

Да, Вы правы) Погуглил на эту тему и всё получилось. Надо бы действительно на Си перенести.



Офлайн

#6 Янв. 7, 2010 22:29:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

проблема с чтением бинарных файлов

Будут проблемы с созданием C extension - спрашивайте. На этом вопросе собаку съел



Офлайн

#7 Янв. 8, 2010 00:28:23

arikitik
От:
Зарегистрирован: 2009-12-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с чтением бинарных файлов

ок, спасибо!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version