Branch data Line data Source code
1 : : /**
2 : : * @file MeasureEntropy.h
3 : : * @author Kai KRETSCHMANN
4 : : *
5 : : * @copyright SPDX-License-Identifier: MIT
6 : : *
7 : : * @brief Real entropy calculation class for doing measurements.
8 : : *
9 : : **/
10 : :
11 : : #include <string>
12 : : #include <map>
13 : : #include <iostream>
14 : : #include <algorithm>
15 : : #include <cmath>
16 : :
17 : : #include "spdlog/spdlog.h"
18 : : #include "MeasureEntropy.h"
19 : :
20 : : using namespace std;
21 : :
22 : : namespace jastacry {
23 : :
24 : 8 : MeasureEntropy::MeasureEntropy(const string& f) :
25 : 8 : MeasureBase({f}) {
26 [ + - ]: 7 : spdlog::debug("CTOR MeasureEntropy normal");
27 : 7 : }
28 : :
29 : 268 : double MeasureEntropy::log2(const double number) {
30 : 268 : return log(number) / log(2);
31 : : }
32 : :
33 : 4 : void MeasureEntropy::measure() {
34 : 4 : const char* data = (char*)_buffer.data();
35 [ + - ][ + - ]: 8 : std::string teststring(data, getFilesize());
36 : 8 : std::map<char, int> frequencies;
37 [ + + ]: 2076 : for (auto c : teststring)
38 [ + - ]: 2072 : frequencies[c]++;
39 : 4 : auto numlen = teststring.length();
40 [ + + ]: 272 : for (std::pair<char, int> p : frequencies) {
41 : 268 : auto freq = static_cast<double>(p.second) / numlen;
42 [ + - ]: 268 : _infocontent -= freq * log2(freq);
43 : : }
44 : 4 : }
45 : :
46 : 2 : void MeasureEntropy::printResult() {
47 : 2 : spdlog::info("The information content of {} is {}", getFilename(), _infocontent);
48 : 2 : }
49 : :
50 : 6 : double MeasureEntropy::getResult() {
51 : 6 : spdlog::info("Return result of {}", _infocontent);
52 : 6 : return _infocontent;
53 : : }
54 : :
55 [ + - ][ + - ]: 4 : } /* namespace jastacry */
|