Найти - Пользователи
Полная версия: Декомпрессия lzma 86 dec head
Начало » Python для новичков » Декомпрессия lzma 86 dec head
1
StreamThread
Приветствую

Поддерживает ли Python распаковку lzma 86 dec head?
Имеется файл в котором содержатся “куски” сжатые данным методом (начинаются с флага ‘00 5D 00 00’). Известны размеры каждого куска в распакованном состоянии, и по отдельности легко открываются 7z'ипом.
Но модуль lzma выдает: ‘Input format not supported by decoder’.

В аттаче пример одного из “кусков” (Сжатое DDS изображение. Размер после распаковки: 8320)

py.user.next
Скорее всего, придётся тебе из скрипта на питоне вызывать программу 7z.
StreamThread
А каким образом скормить считанный “кусок”, представляющий из себя последовательность байт, в вызов 7z'па принимающего хендл файла на диске? Загрузить кусок во временный файл?

Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется. Может есть способ как-то указать Декомпрессору в каком порядке байт работать? У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.
DamMercul
StreamThread
Загрузить кусок во временный файл?
Да
StreamThread
Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется
7z работает на big-endian
StreamThread
Может есть способ как-то указать Декомпрессору в каком порядке байт работать?
…нет, только BE
StreamThread
У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.
https://docs.python.org/3/library/lzma.html#lzma.LZMADecompressor
py.user.next
StreamThread
А каким образом скормить считанный “кусок”, представляющий из себя последовательность байт, в вызов 7z'па принимающего хендл файла на диске? Загрузить кусок во временный файл?
Да, поначалу в файл сохраняешь, потом вызываешь 7z для этого файла и пишешь в файл вывода, потом читаешь файл вывода. Когда всё работает, оптимизируешь это, чтобы было без сохранения в файлы. У 7z есть опции для ввода данных из stdin и вывода данных в stdout. Для всех операций используешь subprocess.Popen(). Делаешь класс, который выполняет compress(ifname, ofname) и decompress(ifname, ofname), используя на низком уровне вызовы программы 7z. Если найдёшь способ без 7z, то свой класс просто перепишешь на низком уровне с вызовов 7z на найденный способ. То есть программа не будет знать, что используется 7z, так как будет обращаться только с объектом твоего класса, который “как-то неизвестно” запаковывает и распаковывает данные.
DamMercul
py.user.next
Можно еще исп. библиотеку /usr/lib/p7zip/7zr через ctypes.CDLL, в документации я думаю есть инструкция (надеюсь, эта та библиотека)
py.user.next
DamMercul
Можно еще исп. библиотеку
Можно модуль написать сишный. Исходники этого алгоритма лежат в сети. Просто зачем заморачиваться ради одного нераспространённого случая. Как определить, что случай не распространённый: если один раз понадобилось это - это редкость; если второй раз понадобилось это - это просто один повтор; если в третий раз понадобилось это - это система. Вот когда появляется система, тогда и надо писать программу для решение этой задачи. И, конечно, писать её надо не на коленке и за один день, а создавать репозиторий, делать все заготовки для долгосрочной работы, делать автоматическую сборку проекта, тестирование, бэкап. То есть у тебя появляется полноценная программа, которая живёт во времени своей жизнью и будет меняться в течение лет. И уже к первой версии программы ты можешь обращаться из своего скрипта, чтобы он с её помощью выполнил задачу. Они - скрипт и модуль - не зависят друг от друга и не влияют на развитие друг друга.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB