Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2010 09:25:44

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

чтение структур из бинарного файла

есть бинарный файл,состоящий из 2-х частей - метаданные и массив данных от АЦП.Метаданные - набор структур(известных),количество которых самоопределяется.Первая структура может быть описана так: header_fmt=“HHfHIIHHI8s31sH”.Если подсчитать “вручную”,то размер 67 байт(так и должно быть).Однако struct.calcsize(header_fmt) дает размер в 68 байт(?).Хуже того,при считывании первые 3 значения правильные,а дальше белиберда.Если проверить с помощью Hex-редактора,то получается,что для ‘f’ считывается 8 байт,хотя struct.calcsize('f') дает 4.(?) Как это побороть?
Последнее число в header_fmt определяет число следующих структур.Как считать эти структуры в массив(список)?
Python 2.6.4 Windows XP sp3 NetBeans 6.8(проверял и в PyScripter).



Офлайн

#2 Май 4, 2010 18:58:16

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

чтение структур из бинарного файла

По умолчанию идет native format ‘@’. Ваши поля структуры выравниваются так, как принято в используемой архитектуре. На x64 у меня получается 70 байт.
header_fmt=“=HHfHIIHHI8s31sH” делает то, что вам нужно.
Структуры в список придется читать вручную.
Например, через struct.unpack_from
lst =



Офлайн

#3 Май 5, 2010 05:26:06

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

чтение структур из бинарного файла

Кстати, посмотрите на библиотеку construct



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

Офлайн

#4 Май 5, 2010 09:38:23

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

чтение структур из бинарного файла

Андрей Светлов
По умолчанию идет native format ‘@’. Ваши поля структуры выравниваются так, как принято в используемой архитектуре. На x64 у меня получается 70 байт.
header_fmt=“=HHfHIIHHI8s31sH” делает то, что вам нужно.
Структуры в список придется читать вручную.
Например, через struct.unpack_from
lst =
к сожалению мне надо считывать точно 67 байтов,как там дальше идет приведение,меня не волнует.
Вы упомянули про native format- можно ли им “поиграть”,чтобы получить то,что мне нужно?
Большое спасибо,что откликнулись! Тяжело переходить с Матлаба на Питон:(((



Офлайн

#5 Май 5, 2010 09:44:31

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

чтение структур из бинарного файла

PooH
Кстати, посмотрите на библиотеку construct
Большое спасибо! Похоже то,что надо…..
Есть только одно НО…библиотека для Питона 2.4,а как её “прикрутить” к 2.6.4?
Я в Питоне ещё только “пользователь”, вынужден переходить на него с матлаба - универ не хочет покупать матлаб…:(((



Офлайн

#6 Май 5, 2010 12:14:54

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

чтение структур из бинарного файла

Vitto, читать умеете? Поставьте = перед спецификацией формата.



Офлайн

#7 Май 6, 2010 05:37:35

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

чтение структур из бинарного файла

Vitto
Есть только одно НО…библиотека для Питона 2.4,а как её “прикрутить” к 2.6.4?
Почему только для 2.4? Вот http://pypi.python.org/pypi/construct/2.00 В принципе все что можно сделать с ней, можно и через struct сделать, просто с ней удобней.
Vitto
Я в Питоне ещё только “пользователь”, вынужден переходить на него с матлаба - универ не хочет покупать матлаб…:(((
На всякий случай - про SciPy знаете?



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

Офлайн

#8 Май 6, 2010 08:00:47

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

чтение структур из бинарного файла

PooH
Vitto
Есть только одно НО…библиотека для Питона 2.4,а как её “прикрутить” к 2.6.4?
Почему только для 2.4? Вот http://pypi.python.org/pypi/construct/2.00 В принципе все что можно сделать с ней, можно и через struct сделать, просто с ней удобней.
Vitto
Я в Питоне ещё только “пользователь”, вынужден переходить на него с матлаба - универ не хочет покупать матлаб…:(((
На всякий случай - про SciPy знаете?
Большое спасибо за ссылку!
Про sciPy cлышал и смотрел…Собственно,пока я приглядываюсь к свободному ПО для научных исследований.Больше всего мне понравилось pythonxy(), но система очень большая и пока для меня сложная. Надо изучать питон,что и начал делать с получения данных для обработки. К сожалению данные “чужие”,формируются прогой,написанной на си,“винегрет” структур и бинарных данных(массивов выборок).
В матлабе можно описать структуру(при этом типы данных достаточно разнообразны),считать её целиком(даже,если это массив структур) в соответствующую переменную.Как это сделать в питоне,не понимаю.Например,можно ли сделать что-то подобное: Z= a,d,c=struct.unpack(fmt,f.read(..))? Или лучше определить класс без методов? Мне б хотелось обращаться к полям как Z.a…?



Офлайн

#9 Май 6, 2010 11:34:25

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

чтение структур из бинарного файла

pythonxy() - это дистрибутив включающий кучу научных библиотек, в том числе SciPy



Офлайн

#10 Май 6, 2010 13:43:32

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

чтение структур из бинарного файла

Vitto
header_fmt=“HHfHIIHHI8s31sH”
Может я чего-то недопонял, но ведь нечитаемо. Не лучше ли структуру сделать как наследника Structure из ctypes? Там и полезный параметр _pack_ есть.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version