Архиватор · Шаг 4 из 4
Распаковать обратно
Распаковка идёт по тому же дереву, что упаковка: биты читаются по одному, и каждый бит — шаг по дереву от корня, 0 — налево, 1 — направо. Дошли до листа — вот очередной байт, и снова от корня. Добитые в конце нули не читаются: их число записано в первом байте.
Что сделать
Распакуйте байты обратно, шагая по дереву бит за битом и не читая добитые в конце нули.
Что приходит
upakovano— байты из шага 3: первый — число добитых нулей, дальше — битыderevo— то же дерево, что при упаковке: лист — байт (число), узел — пара; илиNone
Что вернуть
Исходные байты; пустые данные или None вместо дерева — b"".
Допишите функцию raspakovat в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Распаковщик строит дерево по частотам из архива шагом 1 и зовёт raspakovat на всё, что лежит после заголовка. Решите шаг — и файл вернётся байт в байт.
raspakovat(b"\x00Z", (97, (98, 99))): добитых нулей нет, Z — это биты 01011010. По дереву: 0 — лист 97, 10 — 98, 11 — 99, 0 — 97, 10 — 98. Ответ b"abcab".
raspakovat(b"\x00Z", (97, (98, 99)))
b'abcab'
Первый байт — сколько нулей добито в конце. Остальные байты — цепочка бит: каждый байт — восемь бит, старший первым (Z = 90 — "01011010"). Последние добитые нули отбросить.
Дерево — кортеж: идти от корня, на 0 — в левое поддерево, на 1 — в правое; на листе записать его байт и вернуться к корню.
Дерево — один лист (не кортеж): каждый бит — это его байт.
Меньше двух байтов на входе (нет ни одного байта данных) или дерево None — пустой ответ b"".
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.