Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Форматы файлов и данных > Flate-декомпрессор на Python. Где ошибка?


Автор: LShadow77 17.10.2011, 14:57
Здравствуйте!
Понадобилось конвертировать один PDF-файл в fb2. Поскольку ни один из перепробованных мною 
конверторов не справился с задачей должным образом, решил написать свой скрипт на Python.
Т.к. данные потоков моего PDF-документа сжаты по алгоритму zlib/Flate (фильтр /FlateDecode), то 
пришлось реализовать собственный декомпрессор.

Естественно, в целях отладки, стал декодировать различные данные, как из потоков PDF, так и из 
ZIP-архивов. И всё работало до тех пор, пока не натолкнулся на следующий фрагмент из 39 байт
(собственно данные тут выделены, первые 2 байта 48 89 - заголовок zlib):
user posted image
Ошибка декомпрессии! Вот отладочный лог:
Код

Hdr=1,IsLast=0
output('q\rq\r447 0')
DistCode=16
Len=3,Dist=359
output('\x00\x00\x00')
output('\x00\x00\x00\x03T')
DistCode=14
Len=103,Dist=175
output('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
output('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r/Im0 Do\r\rQ')
DistCode=16
Len=3,Dist=257
output('\x00\x00\x00')
output('\x00\x00\x00\x10\x00')

Hdr=2,IsLast=0
nLit=261,nDist=3,nCLen=6
---- Unexpected end of data ----


Здесь видно, что первые 9 байт декодировались нормально (строка "q\rq\r447 0", что похоже на 
истину), а вот дальше следует код Length/Distance. После декодирования получилось, что длина 
повторившейся последовательности равна 3, вот расстояние до неё аж 359, при том, что "скользящее
окно" заполнено только на 9 байт! Здесь явно не порядок! Ну а в конце, данные неожиданно 
закончились без маркера конца 256.

Вопрос: где ошибка?
В PDF-файле? Но ведь он спокойно открывается. И этот поток каким-то образом прочитывается (проверял).
В коде декомпрессора? Но я уже перепроверил всё что можно. Декодировал больше сотни разных 
данных, - всё работает как часы! Сбой - только на этом куске.

Вот, собственно, бинарник:
http://www.sendspace.com/file/qaakut
http://uploadbox.com/files/54637637c5

Если есть на форуме спецы по сжатию, то очень надеюсь на помощь, а то скоро крыша поедет!
А если у вас есть собственная реализация алгоритма Inflate, то попробуйте декодировать прилагаемый файл и отпишитесь о результате.

Заранее спасибо!



Автор: LShadow77 14.11.2011, 15:02
И так, за три недели моего вынужденного отсутствия было 907 посещений и 0 ответов! Ну неужели нет никого, кто экспериментировал с flate-компрессией? Очень странно!

Автор: LShadow77 14.12.2011, 16:06
Не уж-то таки никому не интересно, а?!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)