【发布时间】:2014-09-30 21:23:37
【问题描述】:
我正在尝试通过将 .exe 文件作为输入来计算它的熵。但是,我得到的是零值而不是答案。
文件的熵可以理解为文件中每个字符(pi*log(pi))的总和。我正在尝试计算 .exe 文件的熵。但是,我最终得到一个“0”。 '.exe' 文件肯定有输出。
下面是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include "stdbool.h"
#include <string.h>
#include <conio.h>
#include <math.h>
#define MAXLEN 100
int makehist( char *S, int *hist, int len) {
int wherechar[256];
int i,histlen;
histlen=0;
for (i=0;i<256;i++)
wherechar[i]=-1;
for (i=0;i<len;i++) {
if (wherechar[(int)S[i]]==-1) {
wherechar[(int)S[i]]=histlen;
histlen++;
}
hist[wherechar[(int)S[i]]]++;
}
return histlen;
}
double entropy(int *hist, int histlen, int len) {
int i;
double H;
H=0;
for (i=0;i<histlen;i++) {
H-=(double)hist[i]/len*log((double)hist[i]/len);
}
return H;
}
void main() {
char S[100];
int len,*hist,histlen;
int num;
double H;
int i=0;
int count =0;
FILE*file = fopen("freq.exe","r");
while (fscanf(file,"%d",&num)>0)
{
S[i]=num;
printf("%d",S[i]);
i++;
}
hist=(int*)calloc(i,sizeof(int));
histlen=makehist(S,hist,i);
H=entropy(hist,histlen,i);
printf("%lf\n",H);
getch();
}
【问题讨论】:
-
天哪。你的缩进怎么了?那是无法阅读的。
-
当要求人们阅读您的代码时,请更好地格式化。缩进、运算符周围的空格(例如
for(i = 0; i < 256; i++))等 -
@MattiVirkkunen ,@Almo 谢谢大家的建议
-
新颖的想法——打印出一些中间结果,例如。 'i' 和 'histlen',或者使用实际的调试器来检查它们的值。
-
您正在尝试将 exe 文件解析为数字文本文件。不要使用 fscanf。使用 fgetc 或 fread 读取字节。