Архиватор · Шаг 3 из 4
Упаковать в байты
Коды — строки из нулей и единиц, а файл состоит из байтов по восемь бит. Коды всех байтов пишутся подряд, и получившаяся цепочка бит режется по восемь. Последний байт почти всегда неполный — его добивают нулями, а сколько нулей добито, пишут в самый первый байт, иначе распаковщик примет добивку за данные.
Что сделать
Упакуйте данные кодами в байты: коды подряд, по восемь бит в байт, а в первом байте — сколько нулей добито в конце.
Что приходит
dannye— байты, которые сжимаемkody— словарь «байт (число) → код строкой из 0 и 1», из шага 2
Что вернуть
Байты: первый — сколько нулей добито в конце (от 0 до 7), дальше — цепочка бит по восемь в байт.
Допишите функцию upakovat в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Архиватор зовёт upakovat на всё содержимое файла и пишет ответ в архив сразу за заголовком с частотами.
b"abc" кодами a→0, b→10, c→11 — это цепочка 01011, пять бит. До восьми не хватает трёх — добиваем: 01011000, это байт 88, буква X. Ответ b"\x03X": тройка — число добитых нулей, потом сам байт.
upakovat(b"abc", {97: "0", 98: "10", 99: "11"})
b'\x03X'
Перебрать байты данных (перебор bytes даёт числа 0–255) и склеить их коды в одну строку бит.
Длину строки добить нулями справа до кратной восьми: добить нужно от 0 до 7 нулей — ровно столько, сколько не хватает. Если строка уже кратна восьми (и пустая тоже), не добивать ничего.
Ответ — байт с числом добитых нулей, а за ним — строка бит, разрезанная по восемь знаков, каждая восьмёрка — один байт ("01011000" — это 88). Пустые данные — b"\x00".
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.