Как работает трансформатор знают все: «У-у-у-у-у...».
Многие считают, что архиватор работает аналогичным образом.
Это не совсем так.
Работа архиватора состоит из нескольких последовательных шагов.
Сначала он просматривает байт за байтом входной файл.
Для текущей позиции в файле он ищет самый длинный повтор в предыдущей
части файла:
...работает трансформатор ... архиватор работает ... ===== ===== ▲ | └─────────────┘ отступить на 79 байт назад и скопировать оттуда 5 байтов
Строчки могут перекрываться, например так:
... abcabcabc ... ========= ▲ | └──┘ отступить на 3 байта назад и скопировать оттуда 6 байтов
Или даже так:
... fffffffffffffffffffff ... == ▲| └┘ отступить на 1 байт назад и скопировать оттуда 21 байт
Смещение: 87, 125, 22, 355, 2314, .... Длина: 3, 5, 1, 1, 12, ....
Длины обычно невелики, а вот смещения могут оказаться очень большими, до нескольких миллионов. Для эффективного кодирования этих чисел архиваторы идут на всевозможные ухищрения, в результате которых коды смещений оказываются чаще всего небольшими числами.
Два потока чисел, полученных на первом шаге передаются на второй шаг, где их сжимают либо с помощью арифметического кодирования, либо с помощью кода Хаффмена.
Это коды переменной длины, то есть для кодирования каждого символа используется разное количество битов: часто встречающиеся символы кодируются короткой цепочкой битов, редко встречающиеся - более длинной.
Один из самых известных примеров такого кода - азбука Морзе.
Какие же получаются результаты?
Рассмотрим, для примера несколько популярных архиваторов: ARJ, RAR, ZIP, 7Z и сожмем с их
помощью два файла:
Архиватор | Война и мир.fb2 | Excel.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, размер файла можно уменьшить в несколько десятков раз. Правда, этот формат - с потерями. Подробнее про него можно узнать здесь .