Архиваторы: проверка файла на сжимаемость.
Несжимаемые типы файлов
Одной из задач различных упаковщиков и архиваторов является проверка сжимаемого файла на сжимаемость. Иными словами, проверка на то, стоит ли тратить время на сжатие несжимаемого файла, или оставить его в неизменном виде.
Рассмотрим алгоритм проверки файла на сжимаемость. Алгоритм реализован обычными средствами 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 включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д.
Интересные материалы на сайте:
Программа актуально против средств защиты, ограничивающих скачивание файлов из расшаренных ресурсов других компьютеров в локальной сети.
Рисуем прямо на рабочем столе поверх всех окон. Любое изображение, на что способна фантазия. как сохранить промежуточную версию нельзя, то рисунок будет уникальным, неповторимым.
Из большого текста формируется набор ключевых слов, которые должны содержаться на правильной странице правильного веб-сайта.
Теоретические навыки при создании простейшего сайта с нуля.