2014-09-30 4 views
-2

.exe 파일의 엔트로피를 입력으로 계산하려고합니다. 그러나, 나는 대답 대신에 0 값을 얻는다..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(); 
} 
+4

오 이런. 당신의 들여 쓰기가 어떻게 되었습니까? 읽을 수 없습니다. –

+1

사람들에게 코드를 읽도록 요청할 때 더 잘 포맷하십시오. 들여 쓰기, 연산자 주위의 공백 (예 :'for (i = 0; i <256, i ++)') 등 – Almo

+1

@MattiVirkkunen, @ Almo는 제안을 주셔서 감사합니다 – sam

답변

1

이 줄은 숫자를 읽는 것 같다 :

fscanf(file,"%d",&num) 

하지만 난 정말 EXE 파일에 많은 숫자를 찾아 낼 것으로 예상하지 않는다. 그들은 모든 다른 유형의 임의의 바이트 값입니다.

숫자는 숫자 만 0-9 (및 - & + 기호입니다.

3
while (fscanf(file,"%d",&num)>0) 

이렇게하면 앞에 오는 공백, 선택적 기호 및 숫자 시퀀스로 인코딩 된 숫자를 읽습니다. 파일에서 다른 문자가 발견되면 (아마 첫 번째 바이트) 루프가 멈 춥니 다. getc 또는 fread으로 원시 바이트를 읽어야합니다.

또한 StackOverflow에 질문을 제출하기 전에 가장 기본적인 디버깅을 수행하십시오. 분명히 그 루프의 printf는 아무 것도 인쇄하지 못했지만 여러분의 질문에는이 점을 언급하지 않았고 분명히 이유를 조사하지 않았습니다.

일부 다른 문제 :이 사용되지 않습니다

#define MAXLEN 100 

.


void main() 

main의 올바른 정의하지 않습니다. 입력이 100 개 이상의 문자를 포함하는 경우 당신은 행동을 정의되지 않은, 그리고 .exe 파일이 반드시 것이다

int main(void) 

char S[100]; 

사용합니다. 버퍼를 버퍼에 저장하는 대신 읽는 동안 실제로 히스토그램 계산에 바이트를 공급해야합니다. 가장 쉬운 방법은 wherecharhistlen 전역을 만드는 것이지만 필요한 모든 것을 struct에 넣고 struct에 대한 포인터를 각 바이트와 함께 makehist에 전달하고 다시 struct에 대한 포인터를 entropy으로 전달할 수 있습니다.


FILE*file = fopen("freq.exe","r"); 

바이너리 파일 (리눅스에 문제가되지 않지만 Windows에서 수행) "RB"를 열어야합니다. 또한 fopen이 성공했는지 확인해야합니다.


hist=(int*)calloc(i,sizeof(int)); 

hist

256 개 엘리먼트를 가져야한다. 먼저이 바이트를 할당하면 위에 열거 된대로 각 바이트를 처리 할 수 ​​있습니다.


당신은 0


wherechar[(int)S[i]] 파일 부정적인와 문자가있는 경우 정의되지 않은 동작입니다 파일이 비어있는 경우 ... 당신이 len == 확인해야 entropy에서 0으로 나누기를 할 가치가 있습니다. char 대신 unsigned char을 사용해야하며 캐스트가 필요하지 않습니다.

관련 문제