计算文件的熵
Calculate entropy of a file
我试图从谷歌,论坛,维基百科和许多论坛搜索此功能两个多小时,但我找不到它。我该怎么做?我尝试了以下方法,但没有用。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdint.h>
static unsigned int mylog2 (unsigned int val) {
unsigned int ret = -1;
while (val != 0) {
val >>= 1;
ret++;
}
return ret;
}
int main(int argc, char **argv)
{
FILE *pFile;
int i; // various loop index
int j; // filename loop index
int n; // Bytes read by fread;
int size; // Filesize
float entropy;
float temp; // temp value used in entropy calculation
long alphabet[256];
unsigned char buffer[1024];
/* do this for all files */
for(j = 1; j < argc; j++)
{
/* initialize all values */
size = 0;
entropy = 0.0;
memset(alphabet, 0, sizeof(long) * 256);
pFile = fopen(argv[j], "rb");
if(pFile == NULL)
{
printf("Failed to open `%s`n", argv[j]);
continue;
}
/* Read the whole file in parts of 1024 */
while((n = fread(buffer, 1, 1024, pFile)) != 0)
{
/* Add the buffer to the alphabet */
for (i = 0; i < n; i++)
{
alphabet[(int) buffer[i]]++;
size++;
}
}
fclose(pFile);
/* entropy calculation */
for (i = 0; i < 256; i++)
{
if (alphabet[i] != 0)
{
temp = (float) alphabet[i] / (float) size;
entropy += -temp * mylog2(temp);
}
}
printf("%02.5f [ %02.5f ]t%sn", entropy, entropy / 8, argv[j]);
} // outer for
return 0;
}
我知道我做错了。在python中,它似乎要容易得多,在python中它是:
import sys
import math
if len(sys.argv) != 2:
print "Usage: file_entropy.py [path]filename"
sys.exit()
# read the whole file into a byte array
f = open(sys.argv[1], "rb")
byteArr = map(ord, f.read())
f.close()
fileSize = len(byteArr)
print 'File size in bytes:'
print fileSize
print
# calculate the frequency of each byte value in the file
freqList = []
for b in range(256):
ctr = 0
for byte in byteArr:
if byte == b:
ctr += 1
freqList.append(float(ctr) / fileSize)
# print 'Frequencies of each byte-character:'
# print freqList
# print
# Shannon entropy
ent = 0.0
for freq in freqList:
if freq > 0:
ent = ent + freq * math.log(freq, 2)
ent = -ent
print 'Shannon entropy (min bits per byte-character):'
print ent
print
print 'Min possible file size assuming max theoretical compression efficiency:'
print (ent * fileSize), 'in bits'
print (ent * fileSize) / 8, 'in bytes'
### Modifications to file_entropy.py to create the Histogram start here ###
### by Ken Hartman www.KennethGHartman.com
import numpy as np
import matplotlib.pyplot as plt
N = len(freqList)
ind = np.arange(N) # the x locations for the groups
width = 1.00 # the width of the bars
#fig = plt.figure()
fig = plt.figure(figsize=(11,5),dpi=100)
ax = fig.add_subplot(111)
rects1 = ax.bar(ind, freqList, width)
ax.set_autoscalex_on(False)
ax.set_xlim([0,255])
ax.set_ylabel('Frequency')
ax.set_xlabel('Byte')
ax.set_title('Frequency of Bytes 0 to 255nFILENAME: ' + sys.argv[1])
plt.show()
如何在C++中实现相同的目标?希望有人如实回答。
不得以 2 为底计算对数的整数部分。要在 C 语言中以 base2 计算对数,您可以使用 math.h
中的log2
。
香
农熵是H= -1*sum(p_i*log(p_i))
其中p_i是每个符号 i(总和(的频率,如果对数基数为 2,则结果以每个符号的位数为单位,如果对数基数为 n,则以"nats">为单位。 但是,如果您更改数据的表达方式,即如果相同的数据表示为位,字节等,它就会改变。因此,您可以除以 log(n(,其中 n 是可用符号的数量(2 表示二进制,256 表示字节(,H 的范围为 0 到 1(这是归一化的密集香农熵(。
上述熵是一种"密集">形式,即每个符号类似于物理学中的特定熵,每公斤或每摩尔。 常规的"广泛"熵,如物理熵是S=N*H
其中N是文件中的符号数。用上面的 H 进行一些数学运算,给出了一个文件的规范化广泛熵,其中"n"是不同的"i"符号的数量(2 表示二进制,256 表示字节(:
S=N * H / log(n) = sum(count_i*log(N/count_i))/log(n)
对于每个符号频率相等的文件,这给出了S=N
. 熵不会对数据进行任何压缩,因此完全不了解任何模式,因此000000111111具有与010111101000相同的 H 和 S(两种情况下均为 6 个 1 和 6 个 0(。
相关文章:
- 如何计算文件中的"columns"数?
- C++数据文件、数组和计算赋值
- 如何计算文件中的生物数量?
- 计算二进制文件中的位数
- 通过从文件中读取值来计算移动平均线
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 我正在尝试计算文本文件中有多少销售人员 c++
- 在C++中对文件中的值单独执行计算
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- RPN计算器使用头文件进行计算操作和堆栈;用于堆栈的矢量
- 从文件中找出字符'a',然后计算字符出现的行数
- 使用结构数组计算文本文件中单词的出现次数C++
- 快速计算 CSV 文件 C++ 中的行数
- 创建程序以从给定的.txt文件中查找文本,替换并计算单词
- 通过将文本文件读取为字符串/向量来计算加权/未加权 GPA
- 在 64 位 Linux armv8 计算机上编译 32 位二进制文件时遇到问题
- 阅读一个大文件来计算重复K次的单词数
- 在不同的计算机上运行.exe文件.(视觉工作室)
- 使用Proc文件计算CPU使用率%
- 从文本文件计算