#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