Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 14, 2011 22:29:21

zeb
От:
Зарегистрирован: 2011-02-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

сегментация вывода

предисловие

>>> print len(struct.pack(“B”,1))
1
>>> print len(struct.pack(“I”,1))
4
>>> print len(struct.pack(“BI”,1,1))
8

видим что в последнем случае питон уместил байт в 4 байта - хотя я этого не просил.

история:
необходимо собрать в один файл кучку картинок ужимая их через lzo, в последствии этот конечный файл будет распаковываться другой прогой, собственно для нее и ужимается.
и тут выясняется что питон снова выдает вывод с lzo.compress() сегментированным по 4 байта.
что читающая прога не понимает. ибо по сути мы имеем 3 мусорных байта.

вопрос:
как заставить питон сегментировать по одному байт? что является аналогом плюсплюсного
#pragma pack(1)
?



Офлайн

#2 Фев. 14, 2011 22:46:58

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

сегментация вывода

>>> print len(struct.pack(“=BI”,1,1))
5


http://docs.python.org/library/struct.html#struct-format-strings
раздел 7.3.2.1. Byte Order, Size, and Alignment



Отредактировано (Фев. 14, 2011 22:48:09)

Офлайн

#3 Фев. 14, 2011 22:50:49

zeb
От:
Зарегистрирован: 2011-02-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

сегментация вывода

это я уже нашел. но как же быть с выводом библиотеки?



Офлайн

#4 Фев. 14, 2011 23:02:19

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

сегментация вывода

а какая именно библиотека имеется в виду?



Офлайн

#5 Фев. 14, 2011 23:03:29

zeb
От:
Зарегистрирован: 2011-02-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

сегментация вывода

Библиотека lzo http://www.oberhumer.com/opensource/lzo/
ее метод compress возвращает собстенно нужные мне данные. только вот с лишними мусорными байтами



Офлайн

#6 Фев. 15, 2011 00:21:58

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

сегментация вывода

Так вы определитесь: или lzo неправильно работает - и тогда вопросы к ней. Или вы не тот формат struct подсовываете.
zheromo уже написал, что = отключает padding. Это тот самый ваш #pragma pack(1)



Офлайн

#7 Фев. 15, 2011 00:27:46

zeb
От:
Зарегистрирован: 2011-02-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

сегментация вывода

lzo это всего лишь обертка. она выдает результат сжатый библиотекой стоящей в системе. но вот выдает его с мусорными байтами. т.е сжимает она верно но упаковывает не так как надо. что можно придумать что бы это обойти?



Офлайн

#8 Фев. 15, 2011 00:30:50

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

сегментация вывода

библиотека-то open source - вот вам и карты в руки



Офлайн

#9 Фев. 15, 2011 01:05:31

zeb
От:
Зарегистрирован: 2011-02-01
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

сегментация вывода

извиняюсь. покопал по глубже. проблема в чем то ином.
пакует не всегда кратно 4м. но при этом пакует с какими то лишними байтами относительно аналогичного упаковщинка на си. т.е код взят с того же сайта. по идее должно быть аналогично. возможно что проблема где то в записи в файл или в подобном месте.
всем спасибо



Офлайн

#10 Фев. 15, 2011 02:59:06

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

сегментация вывода

Глупый вопрос: а вы файл в бинарном режиме открываете?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version