Рейтинг@Mail.ru

Что такое энтропия файла

Print Friendly, PDF & Email

Любой компьютерный файл, как известно, состоит из байтов. Байт может принимать значения от 0 до 255. Информационная энтропия – это статистический параметр, который показывает вероятность встречаемости определённых байтов в файле.

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

Для демонстрации возьмём три файла разных типов и сравним их гистограммы.

Гистограмма текстового файла

Первый пусть будет текстовый файл (*.TXT). Его гистограмма показана на рисунке:

Гистограмма текстового файла
Гистограмма текстового файла

Текстовый файл содержит только текст. Каждый символ текста кодируется определёнными байтами в соответствии с таблицей кодировки. Хотя видов кодировок достаточно большое количество, представленный файл – в кодировке ASCII, поэтому на первой гистограмме заняты лишь некоторые области, а больше числа 127 значений нет вовсе (127 – предельный код символа в таблице ASCII). Видно, что некоторые из символов (букв или цифр) в файле встречаются чаще, некоторые – реже. Больше всего в текстовом файле пробелов, отсюда и высокий пик на значении байта 3210.

Гистограмма PDF файла

Следующий файл будет формата PDF:

Гистограмма файла PDF
Гистограмма файла PDF

Этот файл имеет все возможные байты, так как формат PDF кодируется не так, как текстовые файлы. Он хранит много служебной информации: форматирование, шрифты, изображения и т.д. Но по его гистограмме видно, что некоторые из байтов встречаются с примерно равной вероятностью, в то время как другие – намного чаще остальных. Отсюда и множественные острые всплески на гистограмме, и в целом она имеет довольно «рваный» вид, хотя и занимает всю доступную ширину.

Гистограмма архива 7Z

И последний файл – заархивированный в формат 7Z:

Гистограмма файла 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

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

Последнее изменениеСреда, 07 Сентябрь 2022 11:52 Прочитано 11438 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email