www.gcmsite.ru

Новости Программы PHP-скрипты Статьи Числа
Услуги Резюме Игры Автомобили Поиск

СИСТЕМНОЕ И ВЕБ-ПРОГРАММИРОВАНИЕ
компьютерная техника, игры

Архиваторы: проверка файла на сжимаемость.
Несжимаемые типы файлов

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

Рассмотрим алгоритм проверки файла на сжимаемость. Алгоритм реализован обычными средствами Delphi 5 с использованием функций FileOpen, ReadFile и FileClose.

Теоретически, несжимаемый файл, это файл, частоты байт от 0 до 255 которого находятся примерно в одном диапазоне величин. Т.е. частота каждого символа примерно равна 0,39%. Расчеты ведутся на файлах, длина которых более 10 Кб. Если просуммировать все частоты, то в результате получим 100%.

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

Итак, рассмотрим этапы определения сжимаемости файла:

    Чтение файла в память
    Подсчет частот символов (словаря файла)
    Выводы о сжимаемости файла

Чтение файла в память:

Var
  Fname: string; // абсолютный или относительный путь к файлу 
  FileHandle : THandle; // указатель на открываемый файл
  inBuf : PChar; // указатель на область памяти, куда будет прочитан файл
  c_inBuf : Cardinal; // размер прочитанного в память файла
  a : array[0..255] of Longword; // массив частот
  Max_Buf : Integer; // максимальный размер памяти для чтения файла

....................

// устанавливаем максимальный размер файла для тестов и выделяем память
Max_Buf := 10000000;   
GetMem(inBuf,Max_Buf);

FileHandle := FileOpen (fname, fmShareDenyNone);
try
  ReadFile(fileHandle, inBuf^,Max_Buf-1,c_inBuf, nil);
finally
  FileClose(fileHandle);
end;

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

Подсчет частот символов:

if c_inBuf > 0
  then
    begin
      for i := 0 to 255 do a[i] := 0;
      for i := 0 to c_inBuf do inc(a[ord(inBuf[i])]);
    end;

После это шага в каждой ячейке массив "a" находится количество встреченных символов, код которых равен номеру ячейки.

Если просуммировать значения всех ячеек массива, то получим число, равное размеру файла.

Проверка на уже сжатые данные:

x1 := c_inBuf / 236;
x2 := c_inBuf / 266;
j := 0;
for i := 0 to 255 do
  if (a[i] < x1) and (a[i] > x2)  then inc(j);
if j > 25
  then  // файл уже сжат
  else // файл не сжат

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

Итоги тестирования алгоритма:

Данная процедура сравнения прошла испытание на файлах нескольких типов. Замечание: параметр "новое сжатие" указывает на новый размер файла после его сжатия архиватором WinRar с максимальной степенью сжатия.

    RAR-архив (187 КБ) сжат (новое сжатие = 187 Кб)
    WAV-файл (306 КБ) не сжат (новое сжатие = 187 Кб)
    BMP-файл (938 КБ) не сжат (новое сжатие = 259 Кб)
    DOC-файл (62 КБ) не сжат (новое сжатие = 13 Кб)
    JPG-файл (167 КБ) сжат (новое сжатие = 168 Кб)
    MP3-файл (652 КБ) сжат (новое сжатие = 639 Кб)
    TXT-файл (131 КБ) не сжат (новое сжатие = 17 Кб)
    HLP-файл (337 КБ) не сжат (новое сжатие = 104 Кб)
    PDF-файл (1763 КБ) не сжат (новое сжатие = 1558 Кб)
    EXE-файл (395 КБ) не сжат (новое сжатие = 168 Кб)
    EXE-файл (упакован ASPack) (177 КБ) сжат (новое сжатие = 172 Кб)

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

Дополнительная информация на тему "работа с файлами":


Apache — это кросплатформаенное программное обеспечение, относящееся к классу http-серверов. Поддерживается множеством операционных систем: Windows, Linux, MacOS и т.д. Одним из ключевых факторов в вопросе использования данного web-сервера является гибкость настройки и надежность выполнения операций. Apache включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д.

Интересные материалы на сайте:

Автор, разработчик: Шаров Евгений   (gcmsite@yandex.ru)
(c) 2000-2020 GCM-Site - системное и веб-программирование
Цитирование материалов сайта возможно только при наличии гиперссылки