C 언어로 XLS 파일의 MD5를 계산하지만 내 노력은 내가 "https://stackoverflow.com/questions/27858288/calculate-md5-for-a-file-in-c-language" 를이 링크에 lirary 및 추천 사용하려고 헛된 에있을 것 같지만, 여전히 제공하는 방법 잘못된 결과, 당신은 나를 도울 수 있습니까 ??내가 XLS 파일의 MD5에 대해 많은 연구를 만든
답변
나는 당신이 준 링크에 대답하는 데 사용되었지만 질문은 닫혔다. 아이디어는 다음과 같습니다. 먼저 파일을 버퍼로 읽습니다. 이 사용하여 다음과 같은 기능을 수행 할 수 있습니다
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. 작업이 끝나면 free
data
을 잊지 마세요.
xls 파일의 MD5는 바이트로 작동하기 때문에 다른 파일 종류의 MD5와 매우 동일합니다. 예제 openssl 구현 openssl/crypto/md5/md5.c 및 md5test.c (코드는 git : //git.openssl.org/openssl.git에 있습니다)를 참조하십시오.
예제에서 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);
@ user300234 예,'strCopy'도 작동하지 않지만 같은 문제입니다. 어쨌든 내 대답이 향상되었습니다. –
xls 파일의 'MD5'? 그것은 이해가되지 않는다. 당신은 파일을 버퍼로 읽어 들인 다음 버퍼에'md5' 해시 알고리즘을 구현해야한다. –
파일의 구조적 내용은 부적합합니다. MD5는 모든 바이트 스트림에 대해 메시지 다이제스트를 생성합니다. – maerics
당신이 링크 한 질문은'fp = fopen (file, "r");'을 사용하여 파일을 여는 것입니다. xls 파일을 포함하여 모든 이진 파일에 잘못된 결과가 표시됩니다. – wimh