2015-01-12 6 views
1

C 언어로 XLS 파일의 MD5를 계산하지만 내 노력은 내가 "https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language" 를이 링크에 lirary 및 추천 사용하려고 헛된 에있을 것 같지만, 여전히 제공하는 방법 잘못된 결과, 당신은 나를 도울 수 있습니까 ??내가 XLS 파일의 MD5에 대해 많은 연구를 만든

+0

xls 파일의 'MD5'? 그것은 이해가되지 않는다. 당신은 파일을 버퍼로 읽어 들인 다음 버퍼에'md5' 해시 알고리즘을 구현해야한다. –

+2

파일의 구조적 내용은 부적합합니다. MD5는 모든 바이트 스트림에 대해 메시지 다이제스트를 생성합니다. – maerics

+0

당신이 링크 한 질문은'fp = fopen (file, "r");'을 사용하여 파일을 여는 것입니다. xls 파일을 포함하여 모든 이진 파일에 잘못된 결과가 표시됩니다. – wimh

답변

3

나는 당신이 준 링크에 대답하는 데 사용되었지만 질문은 닫혔다. 아이디어는 다음과 같습니다. 먼저 파일을 버퍼로 읽습니다. 이 사용하여 다음과 같은 기능을 수행 할 수 있습니다

unsigned char * readFile(const char *path) 
{ 
    FILE * pFile; 
    long lSize; 
    unsigned char * buffer; 
    size_t result; 

    pFile = fopen (path , "rb"); 
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = malloc (sizeof(char)*lSize); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);} 


    // terminate 
    fclose (pFile); 

    return buffer; 
} 

unsigned char * data = readFile("c:\\file.xls"); 

는 그런 다음 데이터의 버퍼에 MD5를 적용해야합니다 파일을 읽어보십시오. 그 질문에 해당하는 과 유사한 코드를 사용할 수 있습니다 (비록 해당 라이브러리의 어떤 라이브러리/구현의 md5 작성자가 사용 된 것인지 모르겠 음). 예 :

char hash[64] = {0}; 
md5_byte_t digest[16] = {0}; 
md5_init(&state); 
md5_append(&state, (const md5_byte_t *)data, filesize); 
md5_finish(&state,digest); 
int i=0;  
for(i; i<16; i++) 
{ 
     snprintf(hash + i*2,sizeof(hash),"%02x",digest[i]); 
} 

이제 hash은 16 진수 문자열로 인코딩 된 파일의 해시를 저장해야합니다. 추신. 실제로 샘플은 바이너리 파일과 함께 strlen을 잘못 사용하고 있습니다. 그래서 위의 readFile 메서드를 제안했습니다. 이 함수는 또한 파일 크기를 얻기위한 코드를 포함합니다.이 코드를 사용하여 파일 크기를 얻은 다음 파일 크기를 md5_append 메서드에 전달할 수 있습니다.

ps. 작업이 끝나면 freedata을 잊지 마세요.

3

xls 파일의 MD5는 바이트로 작동하기 때문에 다른 파일 종류의 MD5와 매우 동일합니다. 예제 openssl 구현 openssl/crypto/md5/md5.c 및 md5test.c (코드는 git : //git.openssl.org/openssl.git에 있습니다)를 참조하십시오.

2

예제에서 strlen을 사용하여 파일 크기를 결정하는 것이 문제입니다. 그러나 .xls 형식은 바이너리이므로 strlen은 제대로 작동하지 않습니다.

파일에서 읽은 총 데이터를 반환하는 함수를 수정하면 제대로 작동합니다.

편집. 다음과 같은 코드를 입력하십시오 :

void *addr; 
struct stat s; 
int ret, fd; 

ret = stat(filename, &s); 
if (ret) { 
    fprintf(stderr, "Error while stat()ing file: %m\n"); 
    return -1; 
} 

fd = open(filename, O_RDONLY);; 
if (fd < 0) { 
    fprintf(stderr, "Error while opening file: %m\n"); 
    return -1; 
} 

addr = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 
if (addr == MAP_FAILED) { 
    fprintf(stderr, "Error while mapping file: %m\n"); 
    close(fd); 
    return -1; 
} 

md5_init(&state); 
md5_append(&state,addr, s.st_size); 
md5_finish(&state,digest); 
+0

@ user300234 예,'strCopy'도 작동하지 않지만 같은 문제입니다. 어쨌든 내 대답이 향상되었습니다. –