2014-04-25 2 views
1

이진 파일에서 매직 넘버를 가져오고 싶습니다. 예를 들어, JPG 파일은 첫 번째 바이트에 매직 넘버가 FFD8입니다. 어떻게 읽을 수 있습니까? 파일 확장자가 마법 번호에 응답하고 파일의 이름을 바꾸지 않는지 확인하는 프로그램을 작성하고 싶습니다.파일의 매직 넘버. C 프로그래밍

이것이 내가 생각해야 할 사항이지만 작동하지 않습니다. 항상 다른 값을 인쇄합니다. 파일이 JPG이고 FFD8이면 마법 번호를 알려주고 싶습니다.

int main() 
{ 
    FILE *f; 
    char fName[80]; 
    char *array; 
    long fSize; 

    printf("Input file name\n"); 
    scanf("%s", fName); 
    if((f=fopen(fName, "rb"))==NULL) 
    { 
     fprintf(stderr, "Error\n"); 
     exit(1); 
    } 

    fseek (f , 0 , SEEK_END); 
    fSize = ftell (f); 
    rewind (f); 
    array=(char *)malloc(fSize+1); 

    fread(array, sizeof(char), 4, f); 
    printf("%x", array); 
    free(array); 
} 
+1

정말로 전체 파일의 크기를 알아 내고 4 바이트 만 관리하고 복사 할 때 버퍼를 충분히 저장할 수있는 이유가 있습니까? 그렇다면 파일 시스템이 행복하게 * 단순한'fstat()'를 사용하여 * 파일 크기를 알려주는 것을 알고 있습니까? – EOF

+0

처음 바이너리 파일을 사용하기 때문에 새로운 것을 시도하고 싶었습니다. 그러나, 그것에 대해 아무것도 찾을 수 없기 때문에 fstat()에 대해 더 자세히 알려주시겠습니까? – user3476022

+0

글쎄,'fstat()'는 C 표준에 없지만 POSIX에서는 다른 OS 계열에있는 것이 거의 확실합니다. 'fstat()'를 사용하기 위해서는'struct stat x'를 생성 한 다음 파일 - desciptor/-name과'x'에'f-/l-/stat()'를 호출하십시오. 그러면'x.st_size'를 보게됩니다. – EOF

답변

2

printf("%x", ...)int 인수를 기대하고는, 즉 포인터, 그것을 char *을주고있다. 그것은 정의되지 않은 동작입니다. 아마 당신은 무엇을 의미

printf("%02hhx%02hhx%02hhx%02hhx\n", array[0], array[1], array[2], array[3]); 

는 16 진수로 처음 4 개 문자를 인쇄하는 것입니다.

을 (덕분에. 변환이 서명 또는 서명되지 않은 char 인수에 적용되도록 지정은 "HH"수정에 대해 저를 을 생각 나게 @chux합니다) (그러나 "FFD8는"의 16 진수 표기가 있습니다 bytes : 0xFF, 0xD8.)

+0

02가 무엇을 의미하는지 말해 줄 수 있습니까? 그리고 나는 이것으로 ffffffffffffffd8ffffffffffffffe0을 얻고 있습니다. 어떤 아이디어? – user3476022

+0

@ user3476022 : 배열을'unsigned char * array;'로 선언하면 올바른 결과를 얻을 수 있습니다. "02"는 각 숫자가 두 자리 숫자로 인쇄됨을 의미합니다. 00, 01, FF. –

+0

고맙습니다. 서명되지 않은 상태로만 작동하는 이유를 설명하면 감사하겠습니다. 저는 초심자이고 처음으로 16 진수로 작업합니다. – user3476022