Что такое энтропия файла
Любой компьютерный файл, как известно, состоит из байтов. Байт может принимать значения от 0 до 255. Информационная энтропия – это статистический параметр, который показывает вероятность встречаемости определённых байтов в файле.
Визуально оценить степень энтропии можно с помощью гистограммы – распределения вероятности повторов одинаковых байтов в файле. По энтропии файла можно предположить, какого типа файл перед нами, видя только его гистограмму.
Для демонстрации возьмём три файла разных типов и сравним их гистограммы.
Гистограмма текстового файла
Первый пусть будет текстовый файл (*.TXT). Его гистограмма показана на рисунке:
Текстовый файл содержит только текст. Каждый символ текста кодируется определёнными байтами в соответствии с таблицей кодировки. Хотя видов кодировок достаточно большое количество, представленный файл – в кодировке ASCII, поэтому на первой гистограмме заняты лишь некоторые области, а больше числа 127 значений нет вовсе (127 – предельный код символа в таблице ASCII). Видно, что некоторые из символов (букв или цифр) в файле встречаются чаще, некоторые – реже. Больше всего в текстовом файле пробелов, отсюда и высокий пик на значении байта 3210.
Гистограмма PDF файла
Следующий файл будет формата PDF:
Этот файл имеет все возможные байты, так как формат PDF кодируется не так, как текстовые файлы. Он хранит много служебной информации: форматирование, шрифты, изображения и т.д. Но по его гистограмме видно, что некоторые из байтов встречаются с примерно равной вероятностью, в то время как другие – намного чаще остальных. Отсюда и множественные острые всплески на гистограмме, и в целом она имеет довольно «рваный» вид, хотя и занимает всю доступную ширину.
Гистограмма архива 7Z
И последний файл – заархивированный в формат 7Z:
Гистограмма архива 7Z имеет две основные особенности: во-первых, все байты встречаются в заархивированном файле с более-менее равной вероятностью (достаточно ровный верхний край), а во-вторых, практически отсутствует свободное пространство над гистограммой, что говорит о почти полном отсутствии избыточности такого файла. Отсюда можно сделать вывод, что алгоритм архиватора каким-то особым образом «перемешивает» байты файла, чтобы добиться их максимально равномерного распределения.
Таким образом, энтропия в информатике, как и в физике – это мера неупорядоченности системы, в данном случае – неупорядоченности распределения байтов в файле. Энтропия позволяет судить о степени сжатия файла и – косвенно – о его типе.
Программа визуализации энтропии файлов
Выкладываю программу, которая показывает энтропию файла в линейном или логарифмическом масштабе. Эта утилита очень простая и делает только это. Она работает под Windows, и для неё нужен .NET версии 3.5. Программа может считать энтропию даже для очень больших файлов (но в ней не реализована многопоточность, поэтому при обработке больших файлов интерфейс программы будет «подвисать»).
Программа визуализации содержимого файлов
Также полезным инструментом может быть утилита, которая показывает содержимое файла в виде двухмерного изображения. Это может пригодиться, например, когда необходимо быстро визуально сравнить несколько файлов. Программа побайтно считывает файл и рисует каждый байт в 256-ти градациях серого. Один байт – один пиксель изображения.
Допустим, вы реализовали алгоритм сжатия информации с потерей качества (типа JPEG или иной) и упаковали им свои файлы. С помощью этой утилиты вы можете оценить, насколько серьёзными оказались потери, и какое качество будет приемлемо.
Программа позволяет выбрать сразу несколько файлов и последовательно переключаться между ними, визуально оценивая различия. Только учтите, что если открываете большие файлы, это может привести к зависанию программы.
В меню «Данные» – «Задать массив» можно задать произвольный массив 16-ных значений. Разделители не важны, можно написать всё слитно, главное что программа группирует их по 2 (например, пишите не B, а 0B). Однако никакие префиксы типа "0x" не нужны. Пример корректной записи:
0A 0B 0C 0D 0E 0F FF FF FF 00 01 13или то же самое:
0a0b0c0d0e0fffffff000113или то же самое ещё раз:
0A0B-0C0D-0e0f-ffff-fF00-0113
Конечно, такой короткий массив вы едва ли разглядите на изображении, т.к. каждый байт описывает ровно один пиксель изображения. Масштабирования картинки в программе нет.
Download attachments:
- Скачать программу расчёта энтропии файлов (2703 Downloads)
- Скачать программу визуализации содержимого файла (230 Downloads)