Средства разработки приложений

Модуль AcedCompression


В модуле AcedCompression находятся функции, предназначенные для сжатия бинарных данных методом Зива-Лемпела с последующим преобразованием в код Хаффмана. Упаковка данных осуществляется функцией G_Deflate, которая принимает в качестве параметра Mode одну из констант, выбирающих режим сжатия. Возможны следующие режимы:

  • dcmNoCompression – данные не сжимаются, просто копируются в выходной массив. Функция G_Deflate переключается в этот режим автоматически, если сжимаемые данные не являются избыточными, например, если они зашифрованы или упакованы другим методом. Размер исходного массива увеличивается при этом на 4 байта, в которых сохраняется длина исходного массива. Таким образом, 4 байта – это максимальная величина, на которую увеличивается длина исходного массива в случае невозможности его сжатия.
  • dcmFastest – используется, когда надо сжать данные максимально быстро. При этом качество сжатия во многом зависит от характера самих данных. Если они содержат большое число повторяющихся фрагментов, использование этого режима нежелательно, т.к. в нем используется "облегченный" вариант словарного метода сжатия (Зива-Лемпела). Сжатие Хаффмана, наоборот, реализовано в полной мере. Оно основано на разности частот появления отдельных кодов символов. Если к исходным данным применим такой способ упаковки и они содержат мало повторяющихся последовательностей, режим dcmFastest может оказаться даже более эффективным, чем режим dcmMaximumCompression, за счет большей дисперсии частот отдельных кодов. Это справедливо, например, при сжатии wav-файлов. Максимальное расстояние между повторяющимися последовательностями байт в этом режиме принимается равным 8191 байту.
  • dcmFast – обычная степень сжатия, достигаемая за минимальное время. Вероятно, данный режим является оптимальным при сжатии бинарных данных. В этом случае использование режимов dcmNormal и dcmMaximumCompression приводит к уменьшению размера выходного массива на 1-2%, но время сжатия возрастает в несколько раз. В режиме dcmFast максимальное расстояние между повторяющимися фрагментами данных равно 65535 байтам.
  • dcmNormal – обычно соответствует хорошей степени сжатия.
    Его можно использовать для данных с большим числом повторяющихся фрагментов, например, текстов или doc-файлов. При этом сжатие происходит в 1.5-2 раза быстрее, чем в режиме dcmMaximumCompression, но примерно во столько же раз медленнее, чем в режиме dcmFast. Максимальное расстояние между повторяющимися группами байт принимается равным 131071 байту.
  • dcmMaximumCompression – в этом режиме достигается максимальная степень упаковки, доступная для реализованного в AcedCompression метода сжатия. Может применяться для сильно избыточных данных или для данных, которые редко сжимаются, а затем многократно используются. Максимальное расстояние между повторяющимися фрагментами данных принимается равным 262143 байтам.
В модуле AcedCompression есть два варианта функции G_Deflate. В первом варианте функция сама распределяет память под массив, достаточный для хранения упакованных данных. Во втором варианте массив должен быть создан заранее, а функция G_Deflate только заполняет его данными. Имеются также функции для распаковки сжатого массива данных. Размер исходного массива можно получить вызовом функции G_GetInflatedLength, а сама распаковка данных выполняется функцией G_Inflate. Имеется два варианта этой функции. В первом варианте память под массив, содержащий выходные данные, распределяется функцией G_Inflate. Во втором варианте, массив для хранения распакованных данных должен быть создан заранее размером не менее, чем длина, которую вернул вызов функции G_GetInflatedLength для упакованного массива данных. Следует отметить, что используемый режим сжатия не влияет на скорость распаковки данных (естественно, кроме режима dcmNoCompression, при котором данные итак находятся в распакованном виде). Продолжение

Содержание раздела