- 19, Oct 2024
- #1
Популярный bzip2recover
compression format is used to store all sorts of things. One of the more interesting features is that it consists of several independently decompressible blocks, allowing recovery of partial segments if the file is damaged. The bzip2
программа, входящая в комплект bzip2
, allows recovery of blocks from a bzip2recover
архив. В этом задании вы создадите простой клон .bz2
.
Основная идея состоит в том, чтобы сканировать битовый поток на предмет определенного магического числа и выводить блоки, ограниченные этим магическим числом, в отдельные файлы. Читайте дальше, чтобы узнать кровавые подробности.
Технически файлы bzip2 представляют собой битовый поток, где каждая группа из 8 бит помещается в байт. Первый бит помещается в самый старший бит байта, а восьмой бит — в самый младший бит байта. Файлы начинаются с заголовка «БЖ», и цифры «Н» от 1 до 9, указывающей уровень сжатия (9 – наиболее распространенный). Затем начинается битовый поток.
Битовый поток разбивается на блоки. Каждый блок кодирует N*100 КБ несжатого текста (например, 900 КБ текста для уровня сжатия 9).
Блоки могут начинаться практически в любом месте битового потока и не обязательно начинаться на 8-битной границе. Блоки начинаются с магического числа, которое представляет собой 48-битную последовательность 0x314159265359 (в ASCII «1AY&SY»). Например, последовательность байтов «73 14 15 92 65 35 90» содержит магическое число, смещенное на 4 бита внутри байта.
- Ваша цель — взять файл bzip2 на стандартный ввод и вывести каждый обнаруженный блок BZip2 в отдельный распаковываемый файл. В частности, ваша программа делает следующее:
- Прочтите и пропустите заголовок bzip2 («БЖ» + N)
- Сканируйте битовый поток на предмет магической последовательности.
Скопируйте битовый поток между двумя последовательными магическими последовательностями в новый файл с новым заголовком BZip2 и заголовком блока. Обратите внимание, что для этого может потребоваться перераспределение битового потока, чтобы он начинался с границы байта, и дополнение последнего байта.
Вам не нужно заботиться о разборе блоков, и вы можете предположить, что магическая последовательность всегда запускает блок (т. е. она не находится в середине блока).
Как вы назовете выходные файлы, зависит от вас. Единственное требование состоит в том, чтобы они были каким-то образом четко последовательными (так, например, «a b c ... z aa ab» или «1 2 3 4 5 .. 9 10 11 12» оба приемлемы). Для тестового примера вы можете использовать этот файл
из конкурса IPSC 2014 по решению задач. Это файл bzip2 с четырьмя блоками. Файл в целом фактически распаковывается в другой файл bzip2, содержащий 162 полных блока. Таким образом, вы можете использовать эти счетчики блоков для проверки того, что ваше решение получает все блоки. (Обратите внимание, что файл на самом деле распаковывается еще больше в файлы bzip2, но вы, вероятно, не захотите распаковывать его полностью). Это гольф с одной особенностью: ваш результат — это количество байтов в версии вашего исходного кода, сжатой с помощью bz2. (Я знаю, что это может привести к отправке материаловбольше
, но таковы правила!). Поскольку компрессоры bzip2 могут различаться по производительности, предоставьте версию сжатого файла в кодировке Base64, чтобы подтвердить его размер. (Поэтому вы, возможно, сможете получить более высокий результат, оптимизировав свою программу для bzip2, хотя я не обязательно ожидаю, что кто-то сделает это). Применяются стандартные лазейки.