на школьную страницу...

Как работает архиватор

С.И.Хашин


Как работает трансформатор знают все: «У-у-у-у-у...».
Многие считают, что архиватор работает аналогичным образом.
Это не совсем так.

Работа архиватора состоит из нескольких последовательных шагов. Сначала он просматривает байт за байтом входной файл. Для текущей позиции в файле он ищет самый длинный повтор в предыдущей части файла:

...работает трансформатор ... архиватор работает ...
                     =====         =====
                     ▲             |
                     └─────────────┘
                отступить на 79 байт назад
              и скопировать оттуда 5 байтов

Строчки могут перекрываться, например так:

         ... abcabcabc ...
             =========
             ▲  |
             └──┘
    отступить на 3 байта назад
  и скопировать оттуда 6 байтов
 

Или даже так:

          ... fffffffffffffffffffff ...
              ==
              ▲|
              └┘
     отступить на 1 байт назад
   и скопировать оттуда 21 байт
 
Дописав "мысленно", "виртуально" в начало каждого файла строчку из 256 всевозможных байтов, вместо исходного файла, потока байтов, после первого этапа мы получим два потока чисел:
Смещение: 87, 125, 22, 355, 2314, ....
Длина:     3,   5,  1,   1,   12, ....

Длины обычно невелики, а вот смещения могут оказаться очень большими, до нескольких миллионов. Для эффективного кодирования этих чисел архиваторы идут на всевозможные ухищрения, в результате которых коды смещений оказываются чаще всего небольшими числами.

Два потока чисел, полученных на первом шаге передаются на второй шаг, где их сжимают либо с помощью арифметического кодирования, либо с помощью кода Хаффмена.

Это коды переменной длины, то есть для кодирования каждого символа используется разное количество битов: часто встречающиеся символы кодируются короткой цепочкой битов, редко встречающиеся - более длинной.

Один из самых известных примеров такого кода - азбука Морзе.

Какие же получаются результаты?
Рассмотрим, для примера несколько популярных архиваторов: ARJ, RAR, ZIP, 7Z и сожмем с их помощью два файла:

Вот получающиеся результаты сжатия (размер полученного архива в байтах):

Архиватор Война и мир.fb2Excel.exe
ARJ 1 586 779 9 819 278
RAR 913 989 7 921 519
ZIP 1 547 000 9 800 479
7Z 1 104 753 6 898 313

Таким образом, коэффициент сжатия - от 3 до 6.

Большинство архиваторов имеют GUI - графическую оболочку, в которой все необходимые действия и параметры вы можете задать в диалоге. При этом не надо помнить всевозможные команды и ключи архиватора, а их обычно - несколько десятков.

С другой стороны, если вы каждый день используете архиватор для выполнения одних и тех же действий например, для хранения (на всякий случай) результатов сегодняшней работы, то работа в диалоге становится утомительной и опасной, - можно забыть указать что-то нужное или просто не в том месте поставить галочку. В этом случае лучше один раз набрать в bat-файле необходимую команду со всеми ключами и для вызова архиватора просто запускать этот bat-файл.

Ещё одна интересная возможность, которая, правда, реализована не во всех архиваторах - сплошной (solid) архив. Обычно при упаковке в один архив нескольких файлов каждый из них сжимается независимо от остальных. В результате, если одна и таже цепочка символов встречается в разных файлах, мы не получаем никакого выигрыша при сжатии. При сплошном сжатии все файлы "мысленно" сливаются в один файл и лишь потом сжимаются. В некоторых случаях, например при сжатии большого количества небольших похожих текстов, это может дать очень существенный выигрыш. Правда следует понимать, что в таком случае для извлечения из архива одного-единственного файла, придется архив распаковывать с самого начала.

Помимо обычного сжатия, архиваторы обладают многими очень полезными функциями, например, шифрование. Команда

  RAR a -p12345 -r arch  *.txt
в архив с именем arch.rar положит все файлы с расширением txt из текущего каталога и его подкаталогов. Архив будет зашифрован с паролем "12345". Для извлечения файлов из архива даем команду
  RAR x -p12345 arch 
Не зная пароля архив не распаковать. Если вы забыли или не точно помните одну-две буквы, можно попытаться подобрать пароль простым перебором. Но не следует надеяться подобрать "полностью забытый" пароль - устанете ждать.

Если вы не хотите в открытую набирать пароль на клавиатуре, можно дать команду

  RAR a -p -r arch  *.txt
не указывая никакого пароля. В этом случае архиватор предложит ввести его с клавиатуры в "секретном" режиме, то есть не отображая вводимые символы на экране.

В некоторых случаях без паролей вообще никак не обойтись. Многие почтовые системы (mail.ru, gmail.com и др.) не хотят пересылать exe-файлы (а также dll, скрипты и некоторые другие), - боятся вирусов. Более того, если вы попытаетесь переслать exe-файл через mail.ru, то отправка писем с этого адреса будет блокирована на несколько дней, правда приниматься письма всё равно будут.

Можно попытаться обмануть почтовую систему и упаковать пересылаемые файлы в архив. Но почтовые системы и эту хитрость знают и файл всё равно не пропустят. Единственная возможность - упаковать файлы в архив с паролем. На этом почтовая система сдается и файл пропускает. Пароль (чтобы не забыть) лучше указать тут же, в теле письма. И не надо выдумывать пароли типа:

  kjas&8873s_+-kNN.?,mohi^gwFJ$rc3)kNBaImnd?KM$3&fdyHhf99(24)(
хотя это вполне нормально сработает. Лучше ограничиться паролем
 12345
Не ищите приключений на свою голову!

Очень полезной возможностью архиваторов является работа с архивным битом. Дело в том, что операционная система для каждого файла хранит не только его имя, длину, но и дату и время последнего изменения файла, дату и время последнего обращения к файлу и некоторые другие параметры. Среди них - архивный бит. При создании файла, при его копировании, перемещении, при любом изменении этот бит устанавливается в 1. Поэтому почти у всех файлов на вашем компьютере он равен 1. Однако архиватор имеет возможность обнулять этот бит для тех файлов, которые были упакованы в архив. Команда

  RAR a -r -ac -ao arch  *.txt
упакует в архив только файлы у которых архивный бит равен 1 (ключ -ao) и затем сбросит этот бит в 0 (ключ -ac). В результате в архив будут упакованы лишь файлы, которые были созданы или изменены после предыдущей архивации. Если, например, в вашем рабочем каталоге 100 тысяч файлов, общий размер архива может составить несколько гигабайт. Если же в архив упаковывать лишь файлы, которые изменились с момента предыдущей архивации, ежедневный архив получится совсем небольшим.

Можно сделать так, чтобы имя получаемого архива зависело от даты и времени. Комадна

  RAR a -r -ac -ao -agYYYY_MM_DD_HH_MM_SS arch  *.txt
создает архив с именем
  arch2013_10_24_09_02_45.rar
(24 октября 2013 г. время 9 часов 02 минуты 45 секунд). В этом архиве будут лежать файлы из текущего каталога и его подкаталогов (ключ -r) с расширением txt, но не все, а лишь те, которые изменились с момента предыдущей архивации.

Многие архиваторы умеют создавать многотомные архивы. Эта возможность появилась в древности потому, что архивы часто хранились на дискетах, объём которых был фиксирован (360К, 1.2М или 1.44М байт), и архивы перестали помещаться на дискету. Поэтому архивный файл резался архиватором на части заданного размера, каждую из которых можно было хранить на одной дискете.

В настоящее время эта возможность используется при пересылке больших файлов по почте. Многие почтовые системы не хотят пересылать большие файлы (10М байт и более). В этом случае вы можете упаковать его в многотомный архив. Команда

  RAR a  arch -v6M  MyFilm.avi
создат файлы
 arch.part01.rar arch.part02.rar ...
размером по 6М байт каждый (кроме последнего).

Сжимать с помощью архиватора фотографию - не очень хорошая идея. Возьмем, например, BMP-файл с фотоаппарата размером 4288*2848 точек. Его размер - 36М байт. В результате сжатия архиватором RAR получим файл размера 12М байт. То есть размер уменьшился в 3 раза. Если же мы сохраним тот же файл в формате JPEG, размер файла можно уменьшить в несколько десятков раз. Правда, этот формат - с потерями. Подробнее про него можно узнать здесь .

Flag Counter