Давно, несколько дней писал алгоритмы энтропии чтобы определять упакованные фрагменты программы. Но результаты до сих пор не удоволетворительные. Стандартный алгоритм с log2 очень неточный (даже если считать энтропию кусками по 256 байт и считать среднее арифметическое). Здесь приложено несколько лучших вариантов алгоритма (самые точные, которые получились) на Visual C++ 6.0. Если у кого есть очень точный аглоритм (фактически дающий отношение упакованного файла к оригиналу), поделитесь буду рад.
AndreyMust19 Это не энтропия. Энтропия определяется по формуле Шеннона как раз через log2 и "точнее" ее не бывает, ибо энтропия такая по определению.
AndreyMust19 я уже приводил пример подсчета энтропии "в лоб" по Шенноновской формуле. Я вовсе не спорю, что ее надо обязательно считать через log2, обязательно "в лоб". Есть много вариантов оптимизации. Но энтропия должна оставаться энтропией, а не становится неким числом, характеризующим "отношение упакованного файла к оригиналу".
Вот здесь: http://forum.compression.ru/viewtopic.php?t=2148&sid=9940c03aac27b02878b9caaec83e29d5 интересный комментарий.
В ядре у линуска есть энтропийный детектор. Довольно простой и удобный. Чуть побольше вашего, но слямзить процедуру для личный целей там несложно...
у меня нет времени ковырять алго, спрошу только что будет на ситуацию: взять файл у которого есть одна секция кода скажем на 200h байт и добавить в него 25 секций с рандомным мусором, где каждая секция колеблется от 10.000 гексов до 50.000 гексов, что будет ?
Там рандомный генератор прямо в ядро вставлен. Он мусор из всяких прерываный и прочего накапливает. А потом выдаёт кому-нибудь если надо. А за качеством некий энтропийный детектор следит. Какая-то довольно простенькая процедура. Математику его я понять так и не смог. Но внутри заметил таблицу из чисел для CRC32 (zip полином), только не целиком, а какую-то прореженную (помойму каждое 16-тое число таблицы). Штука судя по всему довольно серьёзная, хотя при этом, не особо большая. Когда буду подальше от работы, могу носом в нужный исходник в ядре (или даже строку) ткнуть. Хотя наверное и самому найти не трудно будет. Где-то области раномного генератора..