Código
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
int CheckFile(char szFilename[]);
ifstream inFile;
long Fsize; // Tamaño del archivo
filebuf *pbuf; // Manejo del buffer
unsigned char *pszDump;
int main(int argc, char** argv)
{
if(argc < 2)
{
cout << "Must input a File!" << endl;
exit(1);
}
if(!CheckFile(argv[1])){exit(1);}
cout << "* Calculating Entropy...";
float entropy = 0.0;
long count[255];
float freq[255];
for(long i = 0; i < 255; i++)
{
count[i] = 0;
freq[i] = 0;
}
for(i = 0; i < Fsize; i++){count[pszDump[i]]++;}
for(i = 0; i < 255; i++)
{
freq[i] = static_cast<double>(count[i]) / static_cast<double>(Fsize);
#ifdef DEBUG
int *UP;
cout << "Prob(" << i << ") = " << static_cast<double>(freq[i], 10) << " (" << count[i] << " Times)\n";
#endif
if (freq[i] > 0.0){entropy -= freq[i] * (log(freq[i]) / log(2.0));}
}
cout << "OK!\n* Entropy = " << entropy << endl;
return 0;
}
int CheckFile(char szFilename[])
{
inFile.open(szFilename, ios::in | ios::binary);
cout << "* Opening file...";
if(inFile.is_open())
{
cout << "OK!\n* Getting file size...";
pbuf=inFile.rdbuf();
Fsize=pbuf->pubseekoff (0,ios::end,ios::in);
pbuf->pubseekpos (0,ios::in);
if(Fsize<1)
{
cout << "Error.\n File is empty.";
inFile.close();
return 0;
}
pszDump = new unsigned char[Fsize];
cout << "OK!\n* Loading file (May take a while)...";
if(pszDump)
{
inFile.read(reinterpret_cast<char*>(pszDump), Fsize);
inFile.close();
cout << "OK!\n";
}
else
{
cout << "Error.\n";
return 0;
}
return 1;
}
else
{
cout << "Error.\n";
return 0;
}
}
Gracias a B3ck por el código original!
Un abrazo
APOKLIPTICO










Autor



En línea


.


