[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/PREF/PrefLib/master/support/algorithm.cpp [Back]  [Original]

#include "algorithm.h"

#define logn(n, base) (log(n) / log(base))

namespace PrefLib {
namespace Support {

Algorithm::Algorithm()
{

}

Algorithm::~Algorithm()
{

}

uint64_t Algorithm::rebase(uint64_t address, uint64_t oldbaseaddress, uint64_t newbaseaddress)
{
    return (address - oldbaseaddress) + newbaseaddress;
}

double Algorithm::entropy(const ByteElaborator::CountResult& cr, uint64_t size)
{
    double e = 0.0;
    uint64_t base = std::min(size, uint64_t(256));

    for(uint64_t i = 0; i < cr.Counts.size(); i++)
    {
        const uintmax_t& c = cr.Counts.at(i);

        if(!c)
            continue;

        double freq = static_cast(c) / static_cast(size);
        e += freq * logn(freq, base);
    }

    return -e;
}

double Algorithm::entropy(IO::DataBuffer *databuffer, uint64_t startoffset, uint64_t size, volatile bool *cancontinue)
{
    ByteElaborator::CountResult cr;
    ByteElaborator::countBytes(cr, databuffer, startoffset, startoffset + size, cancontinue);
    return Algorithm::entropy(cr, size);
}

double Algorithm::entropy(IO::DataBuffer *databuffer, uint64_t size, volatile bool *cancontinue)
{
    return Algorithm::entropy(databuffer, 0, size, cancontinue);
}

double Algorithm::entropy(IO::DataBuffer *databuffer, volatile bool *cancontinue)
{
    return Algorithm::entropy(databuffer, databuffer->size(), cancontinue);
}

} // namespace Support
} // namespace PrefLib


Web Proxy Viewer  |  New URL  |  Original Page