Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2019 16:15:35

StreamThread
Зарегистрирован: 2019-04-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

Приветствую

Поддерживает ли 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)

Прикреплённый файлы:
attachment test.lzma (4,9 KБ)

Офлайн

#2 Апрель 28, 2019 01:08:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

Скорее всего, придётся тебе из скрипта на питоне вызывать программу 7z.



Офлайн

#3 Апрель 28, 2019 15:36:59

StreamThread
Зарегистрирован: 2019-04-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

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

Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется. Может есть способ как-то указать Декомпрессору в каком порядке байт работать? У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.

Офлайн

#4 Апрель 28, 2019 15:50:54

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

StreamThread
Загрузить кусок во временный файл?
Да
StreamThread
Вообще, куски хранятся в Big Endian. Видимо по этому формат и не определяется
7z работает на big-endian
StreamThread
Может есть способ как-то указать Декомпрессору в каком порядке байт работать?
…нет, только BE
StreamThread
У класса lzma.LZMADecompressor() есть атрибуты включающие “формат” и “фильтры”, но тут мне не понятно что следует указывать.
https://docs.python.org/3/library/lzma.html#lzma.LZMADecompressor



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Офлайн

#5 Апрель 28, 2019 16:40:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

StreamThread
А каким образом скормить считанный “кусок”, представляющий из себя последовательность байт, в вызов 7z'па принимающего хендл файла на диске? Загрузить кусок во временный файл?
Да, поначалу в файл сохраняешь, потом вызываешь 7z для этого файла и пишешь в файл вывода, потом читаешь файл вывода. Когда всё работает, оптимизируешь это, чтобы было без сохранения в файлы. У 7z есть опции для ввода данных из stdin и вывода данных в stdout. Для всех операций используешь subprocess.Popen(). Делаешь класс, который выполняет compress(ifname, ofname) и decompress(ifname, ofname), используя на низком уровне вызовы программы 7z. Если найдёшь способ без 7z, то свой класс просто перепишешь на низком уровне с вызовов 7z на найденный способ. То есть программа не будет знать, что используется 7z, так как будет обращаться только с объектом твоего класса, который “как-то неизвестно” запаковывает и распаковывает данные.



Отредактировано py.user.next (Апрель 28, 2019 16:44:01)

Офлайн

#6 Апрель 28, 2019 17:45:11

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

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

Офлайн

#7 Апрель 29, 2019 00:24:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Декомпрессия lzma 86 dec head

DamMercul
Можно еще исп. библиотеку
Можно модуль написать сишный. Исходники этого алгоритма лежат в сети. Просто зачем заморачиваться ради одного нераспространённого случая. Как определить, что случай не распространённый: если один раз понадобилось это - это редкость; если второй раз понадобилось это - это просто один повтор; если в третий раз понадобилось это - это система. Вот когда появляется система, тогда и надо писать программу для решение этой задачи. И, конечно, писать её надо не на коленке и за один день, а создавать репозиторий, делать все заготовки для долгосрочной работы, делать автоматическую сборку проекта, тестирование, бэкап. То есть у тебя появляется полноценная программа, которая живёт во времени своей жизнью и будет меняться в течение лет. И уже к первой версии программы ты можешь обращаться из своего скрипта, чтобы он с её помощью выполнил задачу. Они - скрипт и модуль - не зависят друг от друга и не влияют на развитие друг друга.



Отредактировано py.user.next (Апрель 29, 2019 00:48:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version