Форум сайта python.su
0
Приветствую
Поддерживает ли Python распаковку lzma 86 dec head?
Имеется файл в котором содержатся “куски” сжатые данным методом (начинаются с флага ‘00 5D 00 00’). Известны размеры каждого куска в распакованном состоянии, и по отдельности легко открываются 7z'ипом.
Но модуль lzma выдает: ‘Input format not supported by decoder’.
В аттаче пример одного из “кусков” (Сжатое DDS изображение. Размер после распаковки: 8320)
Отредактировано StreamThread (Апрель 27, 2019 16:16:22)
Прикреплённый файлы:
test.lzma (4,9 KБ)
Офлайн
857
Скорее всего, придётся тебе из скрипта на питоне вызывать программу 7z.
Офлайн
0
А каким образом скормить считанный “кусок”, представляющий из себя последовательность байт, в вызов 7z'па принимающего хендл файла на диске? Загрузить кусок во временный файл?
Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется. Может есть способ как-то указать Декомпрессору в каком порядке байт работать? У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.
Офлайн
13
StreamThreadДа
Загрузить кусок во временный файл?
StreamThread7z работает на big-endian
Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется
StreamThread…нет, только BE
Может есть способ как-то указать Декомпрессору в каком порядке байт работать?
StreamThreadhttps://docs.python.org/3/library/lzma.html#lzma.LZMADecompressor
У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Офлайн
857
StreamThreadДа, поначалу в файл сохраняешь, потом вызываешь 7z для этого файла и пишешь в файл вывода, потом читаешь файл вывода. Когда всё работает, оптимизируешь это, чтобы было без сохранения в файлы. У 7z есть опции для ввода данных из stdin и вывода данных в stdout. Для всех операций используешь subprocess.Popen(). Делаешь класс, который выполняет compress(ifname, ofname) и decompress(ifname, ofname), используя на низком уровне вызовы программы 7z. Если найдёшь способ без 7z, то свой класс просто перепишешь на низком уровне с вызовов 7z на найденный способ. То есть программа не будет знать, что используется 7z, так как будет обращаться только с объектом твоего класса, который “как-то неизвестно” запаковывает и распаковывает данные.
А каким образом скормить считанный “кусок”, представляющий из себя последовательность байт, в вызов 7z'па принимающего хендл файла на диске? Загрузить кусок во временный файл?
Отредактировано py.user.next (Апрель 28, 2019 16:44:01)
Офлайн
13
py.user.nextМожно еще исп. библиотеку /usr/lib/p7zip/7zr через ctypes.CDLL, в документации я думаю есть инструкция (надеюсь, эта та библиотека)
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Офлайн
857
DamMerculМожно модуль написать сишный. Исходники этого алгоритма лежат в сети. Просто зачем заморачиваться ради одного нераспространённого случая. Как определить, что случай не распространённый: если один раз понадобилось это - это редкость; если второй раз понадобилось это - это просто один повтор; если в третий раз понадобилось это - это система. Вот когда появляется система, тогда и надо писать программу для решение этой задачи. И, конечно, писать её надо не на коленке и за один день, а создавать репозиторий, делать все заготовки для долгосрочной работы, делать автоматическую сборку проекта, тестирование, бэкап. То есть у тебя появляется полноценная программа, которая живёт во времени своей жизнью и будет меняться в течение лет. И уже к первой версии программы ты можешь обращаться из своего скрипта, чтобы он с её помощью выполнил задачу. Они - скрипт и модуль - не зависят друг от друга и не влияют на развитие друг друга.
Можно еще исп. библиотеку
Отредактировано py.user.next (Апрель 29, 2019 00:48:55)
Офлайн