В чем заключаются особенности использования различных форматов сжатия файлов

Обновлено: 04.07.2024

Термин "архивация" не совсем точен. Главное назначение программ-архиваторов - сжатие файлов с целью экономии памяти. Поскольку со сжатыми файлами часто невозможно работать по их прямому назначению, их используют для хранения копий файлов, т.е. для их архивации . Сжатию (уплотнению) могут быть подвергнуты: файлы, папки, диски. Сжатие файлов и папок необходимо либо для их транспортировки, либо для резервного копирования, либо для обмена информацией по сети Интернет. Уплотнение дисков применяют для повышения эффективности использования их рабочего пространства (обычно для дисков недостаточной емкости).

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

Архиватором (упаковщиком) называется программа, позволяющая за счет применения специальных методов сжатия информации создавать копии файлов меньшего размера, а также объединять копии нескольких файлов в один архивный файл , из которого можно при необходимости извлечь файлы в их первоначальном виде.

Весь спектр существующих сегодня архиваторов можно разделить на три группы, которые мы условно назовем файловыми , программными и дисковыми .

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

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

Дисковые архиваторы позволяют программным способом увеличить доступное пространство на жестком диске. Типичный дисковый архиватор представляет собой резидентный драйвер, который незаметно для пользователя архивирует любую записываемую на диск информацию и распаковывает ее обратно при чтении. Однако операции чтения/записи файлов несколько замедляются, поскольку процессору требуется время для упаковки и распаковки.

Для архивирования используются специальные программы - архиваторы или диспетчеры архивов. Наиболее известные архиваторы: WinZip; WinRar; WinArj. Эти программы обеспечивают возможность использования и других архиваторов, поэтому, если на компьютере, куда перенесены сжатые в них файлы, отсутствуют указанные программы, архивы можно распаковать с помощью другого архиватора. До сих пор широко используются и соответствующие программы, созданные в MS DOS, но способные работать и в Windows.

Почти все архиваторы позволяют создавать удобные самораспаковывающиеся архивы (SFX – Self-extracting-архивы) – файлы с расширением .ехе. Для распаковки такого архива не требуется программы-архиватора, достаточно запустить архив *.ехе как программу. Многие архиваторы позволяют создавать многотомные (распределенные) архивы, которые могут размещаться на нескольких дискетах.
Основными характеристиками программ-архиваторов являются:

  • скорость работы;
  • сервис (набор функций архиватора);
  • степень сжатия – отношение размера исходного файла к размеру упакованного файла.

Основными функциями архиваторов являются:

  • создание архивных файлов из отдельных (или всех) файлов текущего каталога и его подкаталогов, загружая в один архив до 32 000 файлов;
  • добавление файлов в архив;
  • извлечение и удаление файлов из архива;
  • просмотр содержимого архива;
  • просмотр содержимого архивированных файлов и поиск строк в архивированных файлах;
  • ввод в архив комментарии к файлам;
  • создание многотомных архивов;
  • создание самораспаковывающихся архивов, как в одном томе, так и в виде нескольких томов;
  • обеспечение защиты информации в в архиве и доступ к файлам, помещенным в архив, защиту каждого из помещенных в архив файлов циклическим кодом;
  • тестирование архива, проверка сохранности в нем информации;
  • восстановление файлов (частично или полностью) из поврежденных архивов;
  • поддержки типов архивов, созданных другими архиваторами и др.

Программа WinZip не входит в комплект поставки Windows. Для использования этого архиватора его необходимо предварительно установить на компьютер.
Создать новый архив или добавить файлы в уже существующий архив с помощью программы WinZip можно двумя способами.

I способ создания архива – с использованием контекстных меню (без предварительного запуска архиватора):

  1. Выделить файл (файлы) или папку для архивирования.
  2. Вызвать контекстное меню и выбрать команду Add to Zip, после чего откроется окно WinZip, а поверх него диалоговое окно Add (Добавить). Но при архивировании одного файла или папки удобнее воспользоваться командой Add to *.zip, содержащую имя архива (по умолчанию). Эта команда позволяет выполнить операцию без открытия окна программы WinZip и диалогового окна Add.
  3. В диалоговом окне Add ввести путь и имя архива.
  4. Щелкнуть по кнопке Add.

II способ – с предварительным запуском архиватора:

  1. Запустить программу WinZip.
  2. Ввести команду меню File / New Archive (Файл / Новый архив) или щелкнуть по кнопке New на панели инструментов.
  3. В диалоговом окне New Archive в поле create in: (Поместить в:) указать диск и папку, куда должен быть помещен создаваемый архив.
  4. В поле Имя файла: ввести имя создаваемого архива и щелкнуть OK.
  5. В окне WinZip ввести команду ACTIONS / Add (ДЕЙСТВИЯ/ добавить) либо щелкнуть по кнопке Add на панели инструментов.
  6. В диалоговом окне Add выделить файлы для архивирования, ввести необходимые параметры и щелкнуть по кнопке Add. Выделенные файлы будут помещены в архив, а в окне программы WinZip появится информация об архиве.
  7. Для завершения операции следует выполнить команду FILE / Close Archive (Файл / Закрыть архив).

Разархивировать файлы (извлечь из архива) также можно двумя способами.

I способ – без предварительного запуска архиватора:

  1. Открыть окно необходимой папки и выделить файл архива для распаковки.
  2. Вызвать контекстное меню и выбрать команду Extract to. (Извлечь в. ). Откроется диалоговое окно Extract (Извлечь).
  3. В поле Extract to: указать диск и папку, куда должны быть помещены распакованные файлы.
  4. Щелкнуть по кнопке Extract.

II способ – с предварительным запуском архиватора:

  1. Запустить WinZip.
  2. Ввести команду File/Open Archive (Файл/ Открыть архив) либо щелкнуть по кнопке Open на панели инструментов.
  3. Открыть папку, содержащую файл архива, и выбрать имя файла, который необходимо распаковать.
  4. Щелкнуть по кнопке Открыть. Имена файлов, содержащихся в этом архиве, появятся в окне программы.
  5. Выделить файлы для разархивирования.
  6. Ввести команду ACTIONS / Extract (ДЕЙСТВИЯ / Извлечь) либо щелкнуть по кнопке Extract на панели инструментов.
  7. В открывшемся диалоговом окне Extract указать диск и папку, куда должны быть помещены распакованные файлы. При распаковке всех файлов активизировать переключатель All Files (Все файлы).
  8. Щелкнуть по кнопке Extract.

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

  1. Запустить WinZip.
  2. Ввести команду File / Open Archive (Файл / Открыть архив).
  3. В диалоговом окне Open Archive найти и выделить нужный архивный файл.
  4. Щелкнуть по кнопке Открыть. Имена файлов, содержащихся в этом архиве, появятся в окне программы.
  5. Дважды щелкнуть по имени файла, который необходимо просмотреть. Файл откроется в окне программы, с которой он ассоциирован.
  6. Щелкнуть по кнопке View.

Типы архивов

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

  • .jpg - для графических данных;
  • .mpg - для видеоданных;
  • .mp3 - для звуковых данных.

Характерные форматы сжатия без потери информации:

  • .tif, .pcx и другие - для графических файлов;
  • .avi - для видеоклипов;
  • .zip, .arj, .rar, .lzh, .cab и др. - для любых типов файлов.

Основные алгоритмы сжатия

Говоря об алгоритмах сжатия, будем иметь в виду обратимые алгоритмы.

Алгоритм RLE (Run-Length Encoding) использует принцип выявления повторяющихся последовательностей. При сжатии записывается последовательность из двух повторяющихся величин: повторяемого значения и количества его повторений.

Исходная последовательность: 3, 3, 12, 12, 12, 0, 0, 0, 0.
Сжатая информация: 3, 2, 12, 3, 0, 4.
Коэффициент сжатия: 6/9*100% = 67%.

Алгоритм KWE (Keyword Encoding) предполагает использование словаря, в котором каждому слову соответствует двухбайтовый код. Эффективность сжатия увеличивается с ростом объема кодируемого текста.

Алгоритм Хафмана предполагает кодирование не байтами, а битовыми группами. В нем можно выделить три основные этапа.

Нажмите, чтобы узнать подробности

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

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

- степень сжатия (compress rating) или отношение (ratio) объемов исходного и результирующего потоков;

- скорость сжатия - время, затрачиваемое на сжатие некоторого объема информации входного потока, до получения из него эквивалентного выходного потока;

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

Существует несколько различных подходов к проблеме сжатия информации. Одни имеют весьма сложную теоретическую математическую базу, другие основаны на свойствах информационного потока и алгоритмически достаточно просты. Любой способ, подход и алгоритм, реализующий сжатие или компрессию данных, предназначен для снижения объема выходного потока информации в битах при помощи ее обратимого или необратимого преобразования.

Глава I. Основные понятия и методы сжатия данных. 1.1. Основные способы сжатия.

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

Сжатие информации – это процесс преобразования информации, хранящейся в файле, к виду, при котором уменьшается избыточность в ее представлении и соответственно требуется меньший объем памяти для хранения; процесс сокращения количества битов, необходимых для хранения и передачи некоторого объема информации.

Основные способы сжатия: статистический и словарный.

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


Рис. 1. Классификация алгоритмов сжатия файлов без потерь.

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

Одним из наиболее простых и наглядных является метод сжатия последовательностей одинаковых символов , не относящийся к названным основным методам.

Метод основан на представлении последовательности одинаковых символов в виде двух величин K и S, где K - количество повторяющихся символов, S - код этого символа. Основным недостатком данного метода является то, что он обеспечивает сжатие лишь в случае, когда в исходном файле основную часть составляют повторяющиеся символы. В противном случае сжатый файл может занимать больше места, чем исходный неуплотненный файл. Наиболее эффективно метод сжатия последовательностей одинаковых символов работает в случае двоичных файлов.

Рассмотренные выше алгоритмы в «чистом виде» на практике не применяются из-за того, что эффективность каждого из них сильно зависит от начальных условий. В связи с этим, современные средства архивации, используют более сложные алгоритмы, основанные на комбинации нескольких теоретических методов. Общим принципом в работе таких «синтетических» алгоритмов является предварительный просмотр и анализ исходных данных для индивидуальной настройки алгоритма на особенности обрабатываемого материала.

1.2. Характеристики алгоритмов сжатия и их применимость. 1.2.1. Коэффициент сжатия.

Коэффициент сжатия — основная характеристика алгоритма сжатия. Она определяется как отношение объёма исходных несжатых данных к объёму сжатых, то есть:

где k — коэффициент сжатия, So — объём исходных данных, а Sc — объём сжатых. Таким образом, чем выше коэффициент сжатия, тем алгоритм эффективнее. Следует отметить:

средний (обычно по некоторому тестовому набору данных);

максимальный (случай наилучшего сжатия);

минимальный (случай наихудшего сжатия);

или каким-либо другим.

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

1.2.2. Системные требования алгоритмов

Различные алгоритмы могут требовать различного количества ресурсов вычислительной системы, на которых они реализованы:

оперативной памяти (под промежуточные данные);

постоянной памяти (под код программы и константы);

В целом, эти требования зависят от сложности и «интеллектуальности» алгоритма. Общая тенденция такова: чем эффективнее и универсальнее алгоритм, тем большие требования к вычислительным ресурсам он предъявляет. Тем не менее, в специфических случаях простые и компактные алгоритмы могут работать не хуже сложных и универсальных. Системные требования определяют их потребительские качества: чем менее требователен алгоритм, тем на более простой, а следовательно, компактной, надёжной и дешёвой системе он может быть реализован.

Так как алгоритмы сжатия и восстановления работают в паре, имеет значение соотношение системных требований к ним. Нередко можно усложнив один алгоритм значительно упростить другой. Таким образом, возможны три варианта:

Алгоритм сжатия требует больших вычислительных ресурсов, нежели алгоритм восстановления.

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

Алгоритмы сжатия и восстановления требуют приблизительно равных вычислительных ресурсов.

Наиболее приемлемый вариант для линий связи, когда сжатие и восстановление происходит однократно на двух её концах (например, в цифровой телефонии).

Алгоритм сжатия существенно менее требователен, чем алгоритм восстановления.

Такая ситуация характерна для случаев, когда процедура сжатия реализуется простым, часто портативным устройством, для которого объём доступных ресурсов весьма критичен, например, космический аппарат или большая распределённая сеть датчиков. Это могут быть также данные, распаковка которых требуется в очень малом проценте случаев, например запись камер видеонаблюдения.

Глава II. Программы-архиваторы.

На основе методов сжатия данных созданы различные программы, называемые архиваторами или упаковщиками . Существует много программ-архиваторов, имеющих различные показатели по степени и времени сжатия. Среди самых известных и часто используемых программ выделяются следующие: ARJ, PKZIP, RAR, НА и т. д. для DOS, WinARJ, WinZip, WinRAR, ZipMagic для Windows. Обычно упаковщики осуществляют сжатие сразу несколькими способами.

Как правило, программы для архивации файлов позволяют помещать копии файлов на диске в сжатом виде в архивный файл, извлекать файлы из архива, просматривать оглавление архива и др. В настоящее время архиваторы, работающие под Windows, вытесняют конкурентов в основном за счет использования 32-х битной шины данных, более удобного и интеллектуального интерфейса, расширенных возможностей и более совершенных алгоритмов сжатия. А также эти программы поддерживают не один, как раньше, а сразу несколько различных форматов архивных файлов.

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

Могут содержать программу распаковки. Такие архивные файлы называются самораспаковывающимися.

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


Рис. 2. Пример самораспаковывающегося архивного файла.

К базовым функциям , которые выполняют большинство современных архиваторов, относятся:

- извлечение файлов из архивов;

- создание новых архивов;

- добавление файлов в имеющийся архив;

- создание самораспаковывающихся архивов;

- создание распределенных архивов на носителях малой емкости;

- тестирование целостности структуры архивов;

- полное или частичное восстановление поврежденных архивов;

- защита архивов от просмотра или несанкционированной модификации.

Далее будут рассмотрены две программы-архиваторы WinRAR и WinZip.

2.1. Программа-архиватор WinRAR.

WinRAR - 32-битовая версия Windows архиватора RAR - мощное средство, которое позволяет создавать и управлять архивными файлами.

- интеллектуальный алгоритм сжатия (глубокий анализ данных, подлежащих сжатию, и др.);

- специальный алгоритм сжатия для мультимедиа-файлов;

- не архивное управление RAR;

- плотная архивация, которая может поднять коэффициент сжатия на 10 % -50 % по сравнению с общими методами, особенно при упаковке большого количества небольших аналогичных файлов (при этом файлы представляются как непрерывный поток данных).

- создание архивов с различной степенью уплотнения;

- просмотр как архивных, так и обычных файлов;

- создание многотомных архивов;

-создание самораспаковывающихся архивов (в том числе и многотомных);

- восстановление физически поврежденных архивов;

- возможность работы в двух режимах: полноэкранного интерактивного интерфейса и интерфейса командной строки;

- поддержка других типов архивов, просмотра их содержимого, изменения и преобразования;

- защита архивов паролем.

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

2.1.1. Работа с программой-архиватором WinRAR

Для запуска программы WinRAR необходимо выполнить одно из следующих действий:

- открыть меню Пуск;

- выбрать Программы / WinRAR.


Рис. 3. Вид запущенной программы WinRAR.


Рис. 4. Метод сжатия файлов в WinRAR.

2.1.2. Архивация файлов.

Для создания архива необходимо сначала выбрать необходимые файлы и/или директории из списка файлов в основном окне WinRAR, что можно сделать, используя клавишу Пробел, Shift + клавиши позиционирования или щелкнув левой кнопкой мыши. Затем, выбрав один или более файлов, нажать Alt - A . После этого появится диалоговое окно, в верхнем поле Archive которого надо ввести имя и расположение архивного файла или просто принять предложенное имя. В поле Compression можно выбрать степень уплотнения, что будет влиять на скорость архивации и размер архивного файла. Следующая строка Dictionary size дает возможность изменить размер внутреннего словаря архиватора. Этот параметр также будет влиять на размер конечного файла. С помощью диалогового поля Volume size можно разбить архивный файл на тома разного размера. Диалоговый блок Archiving options также предоставляет возможность изменять некоторые опции архивации, такие как:

- Solid archive / Плотный архив - при этом все файлы в архиве будут представляться как непрерывный поток данных что позволит увеличить степень сжатия, но замедлит обращение к файлам внутри архива;

- SFX archive / Самораспаковывающийся архив - создается ЕХЕ модуль архива;

- Multimedia compression / Мультимедиа-уплотнение - в этом режиме RAR выполняет интеллектуальный анализ данных, направленный на улучшение архивации звука, видео и т. п.;

- Put recovery record / Добавление записи восстановления данных – облегчение восстановления данных при их порче или потере;

- Pat authenticity verification / Добавлять проверку достоверности -WinRAR будет помещать в каждом новом и скорректированном архиве информацию относительно создателя, последнего времени коррекции и архивного имени;

- Delete files after archiving / Удалять файлы после их архивации - после перемещения в архив файлы будут удалены.


Рис. 5. Опции архивации в Win-RAR.

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

2.2. Программа-архиватор WinZip.

Программа-архиватор WinZip - один из старейших (представлен на рынке с 1991 года) архиваторов для Windows, имеющих собственный графический интерфейс. Столь солидный возраст, по всей видимости, и обеспечивает данному архиватору столь внушительную аудиторию пользователей.


Рис. 6. Интерфейс программы-архиватора WinZip.

Архиватор WinZip сжимает файлы, преобразуя их в такие форматы, как: .zip, LHA (.lzh и .lha). Кроме того, WinZip имеет и собственный формат сжатия .zipx, использование которого позволяет добиться максимальной компрессии данных.

WinZip имеет поддержку практически всех известных на сегодня форматов, используемых для сжатия файлов, это: .rar, .7z, .bz2, .cab, .gzip, .tar, .cab и многие другие, кроме того WinZip располагает функционалом, позволяющим преобразовывать сжатые файлы этих форматов в Zip.

С помощью WinZip очень удобно сжимать цифровые фото без потери качества изображения, что может понадобиться, к примеру, для отправки большого количества файлов по электронной почте или FTP, а также и для хранения на всевозможных съемных носителях. В WinZip имеется возможность просмотра и редактирования файлов содержащихся в архивах других типовых форматов, например таких как: 7z или RAR.

Таким образом, было рассмотрено понятие сжатия данных, способы и методы их архивации. Существует множество алгоритмов архивации данных, основанных на различных подходах, с разными вариантами полученных сжатых файлов. Также , на основе этих способов, были разработаны многообразные программы-архиваторы, представляющие собой более простой метод сжатия данных. В данной работе были подробно рассмотрены два архиватора WinRAR и WinZip.

Д. Ватолин, А. Ратушняк, М. Смирнов, В. Юкин. Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео. — Диалог-МИФИ, 2002.

Информатика, ч. I: Методические указания к лабораторным работам / Сост. Н. И. Иопа – Рязань: РГРТА 2002.

Информатика. Базовый курс / С. В. Симонович и др. СПб.: Питер 2001

Информатика: Учебник/ Под ред. проф. Макаровой. 3-е изд. М.: Финансы и статистика, 2001

Кодирование длин серий

Кодирование длин серий (RLE — Run-Length Encoding) — это один из самых простых и распространённых алгоритмов сжатия данных. В этом алгоритме последовательность повторяющихся символов заменяется символом и количеством его повторов.
Например, строку «ААААА», требующую для хранения 5 байт (при условии, что на хранение одного символа отводится байт), можно заменить на «5А», состоящую из двух байт. Очевидно, что этот алгоритм тем эффективнее, чем длиннее серия повторов.

Основным недостатком этого алгоритма является его крайне низкая эффективность на последовательностях неповторяющихся символов. Например, если рассмотреть последовательность «АБАБАБ» (6 байт), то после применения алгоритма RLE она превратится в «1А1Б1А1Б1А1Б» (12 байт). Для решения проблемы неповторяющихся символов существуют различные методы.

Самым простым методом является следующая модификация: байт, кодирующий количество повторов, должен хранить информацию не только о количестве повторов, но и об их наличии. Если первый бит равен 1, то следующие 7 бит указывают количество повторов соответствующего символа, а если первый бит равен 0, то следующие 7 бит показывают количество символов, которые надо взять без повтора. Если закодировать «АБАБАБ» с использованием данной модификации, то получим «-6АБАБАБ» (7 байт). Очевидно, что предложенная методика позволяет значительно повысить эффективность RLE алгоритма на неповторяющихся последовательностях символов. Реализация предложенного подхода приведена в Листинг 1:

  1. type
  2. TRLEEncodedString = array of byte ;
  3. function RLEEncode ( InMsg : ShortString ) : TRLEEncodedString ;
  4. var
  5. MatchFl : boolean ;
  6. MatchCount : shortint ;
  7. EncodedString : TRLEEncodedString ;
  8. N , i : byte ;
  9. begin
  10. N : = 0 ;
  11. SetLength ( EncodedString , 2 * length ( InMsg ) ) ;
  12. while length ( InMsg ) > = 1 do
  13. begin
  14. MatchFl : = ( length ( InMsg ) > 1 ) and ( InMsg [ 1 ] = InMsg [ 2 ] ) ;
  15. MatchCount : = 1 ;
  16. while ( MatchCount < = 126 ) and ( MatchCount < length ( InMsg ) ) and ( ( InMsg [ MatchCount ] = InMsg [ MatchCount + 1 ] ) = MatchFl ) do
  17. MatchCount : = MatchCount + 1 ;
  18. if MatchFl then
  19. begin
  20. N : = N + 2 ;
  21. EncodedString [ N - 2 ] : = MatchCount + 128 ;
  22. EncodedString [ N - 1 ] : = ord ( InMsg [ 1 ] ) ;
  23. end
  24. else
  25. begin
  26. if MatchCount <> length ( InMsg ) then
  27. MatchCount : = MatchCount - 1 ;
  28. N : = N + 1 + MatchCount ;
  29. EncodedString [ N - 1 - MatchCount ] : = - MatchCount + 128 ;
  30. for i : = 1 to MatchCount do
  31. EncodedString [ N - 1 - MatchCount + i ] : = ord ( InMsg [ i ] ) ;
  32. end ;
  33. delete ( InMsg , 1 , MatchCount ) ;
  34. end ;
  35. SetLength ( EncodedString , N ) ;
  36. RLEEncode : = EncodedString ;
  37. end ;
  1. type
  2. TRLEEncodedString = array of byte ;
  3. function RLEDecode ( InMsg : TRLEEncodedString ) : ShortString ;
  4. var
  5. RepeatCount : shortint ;
  6. i , j : word ;
  7. OutMsg : ShortString ;
  8. begin
  9. OutMsg : = '' ;
  10. i : = 0 ;
  11. while i < length ( InMsg ) do
  12. begin
  13. RepeatCount : = InMsg [ i ] - 128 ;
  14. i : = i + 1 ;
  15. if RepeatCount < 0 then
  16. begin
  17. RepeatCount : = abs ( RepeatCount ) ;
  18. for j : = i to i + RepeatCount - 1 do
  19. OutMsg : = OutMsg + chr ( InMsg [ j ] ) ;
  20. i : = i + RepeatCount ;
  21. end
  22. else
  23. begin
  24. for j : = 1 to RepeatCount do
  25. OutMsg : = OutMsg + chr ( InMsg [ i ] ) ;
  26. i : = i + 1 ;
  27. end ;
  28. end ;
  29. RLEDecode : = OutMsg ;
  30. end ;

Вторым методом повышения эффективности алгоритма RLE является использование алгоритмов преобразования информации, которые непосредственно не сжимают данные, но приводят их к виду, более удобному для сжатия. В качестве примера такого алгоритма мы рассмотрим BWT-перестановку, названную по фамилиям изобретателей Burrows-Wheeler transform. Эта перестановка не изменяет сами символы, а изменяет только их порядок в строке, при этом повторяющиеся подстроки после применения перестановки собираются в плотные группы, которые гораздо лучше сжимаются с помощью алгоритма RLE. Прямое BWT преобразование сводится к последовательности следующих шагов:
1. Добавление к исходной строке специального символа конца строки, который нигде более не встречается;
2. Получение всех циклических перестановок исходной строки;
3. Сортировка полученных строк в лексикографическом порядке;
4. Возвращение последнего столбца полученной матрицы.
Реализация данного алгоритма приведена в Листинг 3.
  1. const
  2. EOMsg = '|' ;
  3. function BWTEncode ( InMsg : ShortString ) : ShortString ;
  4. var
  5. OutMsg : ShortString ;
  6. ShiftTable : array of ShortString ;
  7. LastChar : ANSIChar ;
  8. N , i : word ;
  9. begin
  10. InMsg : = InMsg + EOMsg ;
  11. N : = length ( InMsg ) ;
  12. SetLength ( ShiftTable , N + 1 ) ;
  13. ShiftTable [ 1 ] : = InMsg ;
  14. for i : = 2 to N do
  15. begin
  16. LastChar : = InMsg [ N ] ;
  17. InMsg : = LastChar + copy ( InMsg , 1 , N - 1 ) ;
  18. ShiftTable [ i ] : = InMsg ;
  19. end ;
  20. Sort ( ShiftTable ) ;
  21. OutMsg : = '' ;
  22. for i : = 1 to N do
  23. OutMsg : = OutMsg + ShiftTable [ i ] [ N ] ;
  24. BWTEncode : = OutMsg ;
  25. end ;

Проще всего пояснить это преобразование на конкретном примере. Возьмём строку «АНАНАС» и договоримся, что символом конца строки будет символ «|». Все циклические перестановки этой строки и результат их лексикографической сортировки приведены в Табл. 1.


Реализация обратного преобразования на первый взгляд не представляет сложности, и один из вариантов реализации приведён в Листинг 4.

  1. const
  2. EOMsg = '|' ;
  3. function BWTDecode ( InMsg : ShortString ) : ShortString ;
  4. var
  5. OutMsg : ShortString ;
  6. ShiftTable : array of ShortString ;
  7. N , i , j : word ;
  8. begin
  9. OutMsg : = '' ;
  10. N : = length ( InMsg ) ;
  11. SetLength ( ShiftTable , N + 1 ) ;
  12. for i : = 0 to N do
  13. ShiftTable [ i ] : = '' ;
  14. for i : = 1 to N do
  15. begin
  16. for j : = 1 to N do
  17. ShiftTable [ j ] : = InMsg [ j ] + ShiftTable [ j ] ;
  18. Sort ( ShiftTable ) ;
  19. end ;
  20. for i : = 1 to N do
  21. if ShiftTable [ i ] [ N ] = EOMsg then
  22. OutMsg : = ShiftTable [ i ] ;
  23. delete ( OutMsg , N , 1 ) ;
  24. BWTDecode : = OutMsg ;
  25. end ;

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


После сортировки таблицы, полученной на седьмом шаге, необходимо выбрать из таблицы строку, заканчивающуюся символом «|». Легко заметить, что это строка единственная. Т.о. мы на конкретном примере рассмотрели преобразование BWT.

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

Словарное сжатие (алгоритмы LZ)

Группа словарных алгоритмов, в отличие от алгоритмов группы RLE, кодирует не количество повторов символов, а встречавшиеся ранее последовательности символов. Во время работы рассматриваемых алгоритмов динамически создаётся таблица со списком уже встречавшихся последовательностей и соответствующих им кодов. Эту таблицу часто называют словарём, а соответствующую группу алгоритмов называют словарными.

Например, только что инициализированный словарь для фразы «КУКУШКАКУКУШОНКУКУПИЛАКАПЮШОН» приведён в Табл. 3:



При описании алгоритма намеренно было опущено описание ситуации, когда словарь заполняется полностью. В зависимости от варианта алгоритма возможно различное поведение: полная или частичная очистка словаря, прекращение заполнение словаря или расширение словаря с соответствующим увеличением разрядности кода. Каждый из этих подходов имеет определённые недостатки. Например, прекращение пополнения словаря может привести к ситуации, когда в словаре хранятся последовательности, встречающиеся в начале сжимаемой строки, но не встречающиеся в дальнейшем. В то же время очистка словаря может привести к удалению частых последовательностей. Большинство используемых реализаций при заполнении словаря начинают отслеживать степень сжатия, и при её снижении ниже определённого уровня происходит перестройка словаря. Далее будет рассмотрена простейшая реализация, прекращающая пополнение словаря при его заполнении.

Для начала определим словарь как запись, хранящую не только встречавшиеся подстроки, но и количество хранящихся в словаре подстрок:

  1. type
  2. TDictionary = record
  3. WordCount : byte ;
  4. Words : array of string ;
  5. end ;

Встречавшиеся ранее подпоследовательности хранятся в массиве Words, а их кодом являются номера подпоследовательностей в этом массиве.
Также определим функции поиска в словаре и добавления в словарь:
  1. const
  2. MAX_DICT_LENGTH = 256 ;
  3. function FindInDict ( D : TDictionary ; str : ShortString ) : integer ;
  4. var
  5. r : integer ;
  6. i : integer ;
  7. fl : boolean ;
  8. begin
  9. r : = - 1 ;
  10. if D . WordCount > 0 then
  11. begin
  12. i : = D . WordCount ;
  13. fl : = false ;
  14. while ( not fl ) and ( i > = 0 ) do
  15. begin
  16. i : = i - 1 ;
  17. fl : = D . Words [ i ] = str ;
  18. end ;
  19. end ;
  20. if fl then
  21. r : = i ;
  22. FindInDict : = r ;
  23. end ;
  24. procedure AddToDict ( var D : TDictionary ; str : ShortString ) ;
  25. begin
  26. if D . WordCount < MAX_DICT_LENGTH then
  27. begin
  28. D . WordCount : = D . WordCount + 1 ;
  29. SetLength ( D . Words , D . WordCount ) ;
  30. D . Words [ D . WordCount - 1 ] : = str ;
  31. end ;
  32. end ;

Используя эти функции, процесс кодирования по описанному алгоритму можно реализовать следующим образом:
  1. function LZWEncode ( InMsg : ShortString ) : TEncodedString ;
  2. var
  3. OutMsg : TEncodedString ;
  4. tmpstr : ShortString ;
  5. D : TDictionary ;
  6. i , N : byte ;
  7. begin
  8. SetLength ( OutMsg , length ( InMsg ) ) ;
  9. N : = 0 ;
  10. InitDict ( D ) ;
  11. while length ( InMsg ) > 0 do
  12. begin
  13. tmpstr : = InMsg [ 1 ] ;
  14. while ( FindInDict ( D , tmpstr ) > = 0 ) and ( length ( InMsg ) > length ( tmpstr ) ) do
  15. tmpstr : = tmpstr + InMsg [ length ( tmpstr ) + 1 ] ;
  16. if FindInDict ( D , tmpstr ) < 0 then
  17. delete ( tmpstr , length ( tmpstr ) , 1 ) ;
  18. OutMsg [ N ] : = FindInDict ( D , tmpstr ) ;
  19. N : = N + 1 ;
  20. delete ( InMsg , 1 , length ( tmpstr ) ) ;
  21. if length ( InMsg ) > 0 then
  22. AddToDict ( D , tmpstr + InMsg [ 1 ] ) ;
  23. end ;
  24. SetLength ( OutMsg , N ) ;
  25. LZWEncode : = OutMsg ;
  26. end ;

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

Единственная проблема возможна в следующей ситуации: когда необходимо декодировать подпоследовательность, которой ещё нет в словаре. Легко убедиться, что это возможно только в случае, когда необходимо извлечь подстроку, которая должна быть добавлена на текущем шаге. А это значит, что подстрока удовлетворяет шаблону cSc, т.е. начинается и заканчивается одним и тем же символом. При этом cS – это подстрока, добавленная на предыдущем шаге. Рассмотренная ситуация – единственная, когда необходимо декодировать ещё не добавленную строку. Учитывая вышесказанное, можно предложить следующий вариант декодирования сжатой строки:

  1. function LZWDecode ( InMsg : TEncodedString ) : ShortString ;
  2. var
  3. D : TDictionary ;
  4. OutMsg , tmpstr : ShortString ;
  5. i : byte ;
  6. begin
  7. OutMsg : = '' ;
  8. tmpstr : = '' ;
  9. InitDict ( D ) ;
  10. for i : = 0 to length ( InMsg ) - 1 do
  11. begin
  12. if InMsg [ i ] > = D . WordCount then
  13. tmpstr : = D . Words [ InMsg [ i - 1 ] ] + D . Words [ InMsg [ i - 1 ] ] [ 1 ]
  14. else
  15. tmpstr : = D . Words [ InMsg [ i ] ] ;
  16. OutMsg : = OutMsg + tmpstr ;
  17. if i > 0 then
  18. AddToDict ( D , D . Words [ InMsg [ i - 1 ] ] + tmpstr [ 1 ] ) ;
  19. end ;
  20. LZWDecode : = OutMsg ;
  21. end ;

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

Кодирование с помощью деревьев Шеннона-Фано

Алгоритм Шеннона-Фано — один из первых разработанных алгоритмов сжатия. В основе алгоритма лежит идея представления более частых символов с помощью более коротких кодов. При этом коды, полученные с помощью алгоритма Шеннона-Фано, обладают свойством префиксности: т.е. ни один код не является началом никакого другого кода. Свойство префиксности гарантирует, что кодирование будет взаимно-однозначным. Алгоритм построения кодов Шеннона-Фано представлен ниже:
1. Разбить алфавит на две части, суммарные вероятности символов в которых максимально близки друг к другу.
2. В префиксный код первой части символов добавить 0, в префиксный код второй части символов добавить 1.
3. Для каждой части (в которой не менее двух символов) рекурсивно выполнить шаги 1-3.
Несмотря на сравнительную простоту, алгоритм Шеннона-Фано не лишён недостатков, самым существенным из которых является неоптимальность кодирования. Хоть разбиение на каждом шаге и является оптимальным, алгоритм не гарантирует оптимального результата в целом. Рассмотрим, например, следующую строку: «ААААБВГДЕЖ». Соответствующее дерево Шеннона-Фано и коды, полученные на его основе, представлены на Рис. 1:


Кодирование с помощью деревьев Хаффмана


Кодирование с помощью деревьев секущих функций

Кодирование с помощью секущих функций – разработанный авторами алгоритм, позволяющий получать префиксные коды. В основе алгоритма лежит идея построения дерева, каждый узел которого содержит секущую функцию. Чтобы подробнее описать алгоритм, необходимо ввести несколько определений.
Слово – упорядоченная последовательность из m бит (число m называют разрядностью слова).
Литерал секущей – пара вида разряд-значение разряда. Например, литерал (4,1) означает, что 4 бит слова должен быть равен 1. Если условие литерала выполняется, то литерал считается истинным, в противном случае — ложным.
k-разрядной секущей называют множество из k литералов. Если все литералы истинны, то и сама секущая функция истинная, в противном случае она ложная.

Дерево строится так, чтобы каждый узел делил алфавит на максимально близкие части. На Рис. 3 показан пример дерева секущих:


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

Арифметическое кодирование


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

Очевидным плюсом арифметического кодирования является его эффективность, а основным (за исключением патентных ограничений) минусом – чрезвычайно высокая сложность процессов кодирования и декодирования.

Еще вчера казалось, что диск размером в один гигабайт — это так много, что даже неясно, чем его заполнить, и уж конечно, каждый про себя думал: был бы у меня гигабайт памяти, я бы перестал «жадничать» и сжимать свою информацию какими-то архиваторами. Но, видимо, мир так устроен, что «свято место пусто не бывает», и как только у нас появляется лишний гигабайт — тут же находится чем его заполнить. Да и сами программы, как известно, становятся все более объемными. Так что, видимо, с терабайтами и экзабайтами будет то же самое.

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

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

Совсем немного теории для непрофессионалов

Позволю себе начать эту весьма серьезную тему со старой шутки. Беседуют два пенсионера:

— Вы не могли бы сказать мне номер вашего телефона? — говорит один.

— Вы знаете, — признается второй, — я, к сожалению, точно его не помню.

— Какая жалость, — сокрушается первый, — ну скажите хотя бы приблизительно…

Действительно, ответ поражает своей нелепостью. Совершенно очевидно, что в семизначном наборе цифр достаточно ошибиться в одном символе, чтобы остальная информация стала абсолютно бесполезной. Однако представим себе, что тот же самый телефон написан словами русского языка и, скажем, при передаче этого текста часть букв потеряна — что произойдет в подобном случае? Для наглядности рассмотрим себе конкретный пример: телефонный номер 233 34 44.

Соответственно запись «Двсти трцать три трицть четре сорк чтре», в которой имеется не один, а несколько пропущенных символов, по-прежнему легко читается. Это связано с тем, что наш язык имеет определенную избыточность, которая, с одной стороны, увеличивает длину записи, а с другой — повышает надежность ее передачи. Объясняется это тем, что вероятность появления каждого последующего символа в цифровой записи телефона одинакова, в то время как в тексте, записанном словами русского языка, это не так. Очевидно, например, что твердый знак в русском языке появляется значительно реже, чем, например, буква «а». Более того, некоторые сочетания букв более вероятны, чем другие, а такие, как два твердых знака подряд, невозможны в принципе, и так далее. Зная, какова вероятность появления какой-либо буквы в тексте, и сравнив ее с максимальной, можно установить, насколько экономичен данный способ кодирования (в нашем случае — русский язык).

Еще одно очевидное замечание можно сделать, вернувшись к примеру с телефоном. Для того чтобы запомнить номер, мы часто ищем закономерности в наборе цифр, что, в принципе, также является попыткой сжатия данных. Вполне логично запомнить вышеупомянутый телефон как «два, три тройки, три четверки».

Избыточность естественных языков

R = (Hmax — H)/ Hmax

Измерение избыточности естественных языков (тех, на которых мы говорим) дает потрясающие результаты: оказывается, избыточность этих языков составляет около 80%, а это свидетельствует о том, что практически 80% передаваемой с помощью языка информации является избыточной, то есть лишней. Любопытен и тот факт, что показатели избыточности разных языков очень близки. Данная цифра примерно определяет теоретические пределы сжатия текстовых файлов.

Кодирование информации

Сжатие с потерями

Говоря о кодах сжатия, различают понятия «сжатие без потерь» и «сжатие с потерями». Очевидно, что когда мы имеем дело с информацией типа «номер телефона», то сжатие такой записи за счет потери части символов не ведет ни к чему хорошему. Тем не менее можно представить целый ряд ситуаций, когда потеря части информации не приводит к потери полезности оставшейся. Сжатие с потерями применяется в основном для графики (JPEG), звука (MP3), видео (MPEG), то есть там, где в силу огромных размеров файлов степень сжатия очень важна, и можно пожертвовать деталями, не существенными для восприятия этой информации человеком. Особые возможности для сжатия информации имеются при компрессии видео. В ряде случаев большая часть изображения передается из кадра в кадр без изменений, что позволяет строить алгоритмы сжатия на основе выборочного отслеживания только части «картинки». В частном случае изображение говорящего человека, не меняющего своего положения, может обновляться только в области лица или даже только рта — то есть в той части, где происходят наиболее быстрые изменения от кадра к кадру.

В целом ряде случаев сжатие графики с потерями, обеспечивая очень высокие степени компрессии, практически незаметно для человека. Так, из трех фотографий, показанных ниже, первая представлена в TIFF-формате (формат без потерь), вторая сохранена в формате JPEG c минимальным параметром сжатия, а третья с максимальным. При этом можно видеть, что последнее изображение занимает почти на два порядка меньший объем, чем первая.Однако методы сжатия с потерями обладают и рядом недостатков.

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

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

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

Сжатие без потерь

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

Наиболее известны два алгоритма сжатия без потерь: это кодирование Хаффмена (Huffman) и LZW-кодирование (по начальным буквам имен создателей Lempel, Ziv, Welch), которые представляют основные подходы при сжатии информации. Кодирование Хаффмена появилось в начале 50-х; принцип его заключается в уменьшении количества битов, используемых для представления часто встречающихся символов и соответственно в увеличении количества битов, используемых для редко встречающихся символов. Метод LZW кодирует строки символов, анализируя входной поток для построения расширенного алфавита, основанного на строках, которые он обрабатывает. Оба подхода обеспечивают уменьшение избыточной информации во входных данных.

Кодирование Хаффмена

Статическое кодирование

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

Динамическое кодирование

В том случае, когда вероятности символов входных данных неизвестны, используется динамическое кодирование, при котором данные о вероятности появления тех или иных символов уточняются «на лету» во время чтения входных данных.

LZW-сжатие

Алгоритм LZW [2], предложенный сравнительно недавно (в 1984 году), запатентован и принадлежит фирме Sperry.

Какой же выбрать архиватор?

Наверное, читателю будет интересно узнать, какой же архиватор лучше. Ответ на этот вопрос далеко не однозначен.

Если посмотреть на таблицу, в которой «соревнуются» архиваторы (а сделать это можно как на соответствующем сайте в Интернете [3], так и на нашем CD-ROM), то можно увидеть, что количество программ, принимающих участие в «соревнованиях», превышает сотню. Как же выбрать из этого многообразия необходимый архиватор?

Если вас не волнуют меркантильные соображения, то прежде всего необходимо уяснить, что имеется целый ряд архиваторов, которые оптимизированы на решение конкретных задач. В связи с этим существуют различные виды специализированных тестов, например на сжатие только текстовых файлов или только графических. Так, в частности, Wave Zip в первую очередь умеет сжимать WAV-файлы, а мультимедийный архиватор ERI лучше всех упаковывает TIFF-файлы. Поэтому если вас интересует сжатие какого-то определенного типа файлов, то можно подыскать программу, которая изначально предназначена специально для этого.

Существует тип архиваторов (так называемые Exepackers), которые служат для сжатия исполняемых модулей COM, EXE или DLL. Файл упаковывается таким образом, что при запуске он сам себя распаковывает в памяти «на лету» и далее работает в обычном режиме.

Одними из лучших в данной категории можно назвать программы ASPACK и Petite. Более подробную информацию о программах данного класса, а также соответствующие рейтинги можно найти по адресу [4].

Если же вам нужен архиватор, так сказать, «на все случаи жизни», то оценить, насколько хороша конкретная программа, можно обратившись к тесту, в котором «соревнуются» программы, обрабатывающие различные типы файлов. Просмотреть список архиваторов, участвующих в данном тесте, можно на нашем CD-ROM.

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

Поддержка различных форматов

Большинство программ поддерживают один или два формата. Однако некоторые, такие, например, как программа WinAce, поддерживают множество форматов, осуществляя компрессию в форматах ACE, ZIP, LHA, MS-CAB, JAVA JAR и декомпрессию в форматах ACE, ZIP, LHA, MS-CAB, RAR, ARC, ARJ, GZip, TAR, ZOO, JAR.

Умение создавать solid-архивы

Создание solid-архивов — это архивирование, при котором увеличение сжатия возрастает при наличии большого числа одновременно обрабатываемых коротких файлов. Часть архиваторов, например ACB, всегда создают solid-архивы, другие, такие как RAR или 777, предоставляют возможность их создания, а некоторые, например ARJ, этого делать вообще не умеют.

Возможность создавать многотомные архивы

Многотомные архивы необходимы, когда файлы переносятся с компьютера на компьютер с помощью дискет и архив не помещается на одной дискете.

Возможность работы в качестве менеджера архивов

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

Возможность парольной защиты

В принципе, архивирование есть разновидность кодирования, и если раскодирование доступно по паролю, то это, естественно, может использоваться как средство ограничения доступа к конфиденциальной информации.

Удобство в работе

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

Я отнюдь не сторонник консервативной позиции «раз все работает, то главное — ничего не менять», я лишь подчеркиваю, что переход на новую программу должен быть обоснованным.

Читайте также: