65,210
社区成员
发帖
与我相关
我的任务
分享
for (pp = addlp, ppend = addlp + addlsize; pp < ppend; (long*)pp += 16){
extern char* FileMD5(const char* file, char* md5){
/*
计算文件MD5
参数说明:
file 文件路径字符串指针
md5 用于保存MD5的字符串指针
返回值为参数md5
*/
FILE* fh;
char* addlp;
long* temp;
long addlsize, j, M[16], abcdtmp[4], A, B, C, D, a, b, c, d;
long long length, i, cpys;
void *pp, *ppend;
fh = fopen(file, "rb");
fseek(fh, 0, SEEK_END);
length = _ftelli64(fh);
a = A = 0x67452301, b = B = 0xEFCDAB89, c = C = 0x98BADCFE, d = D = 0x10325476;
addlsize = (56 - length % 64 > 0) ? (64) : (128);
if (!(addlp = (char*)malloc(addlsize))) return 0;
cpys = ((length - (56 - length % 64)) > 0) ? (length - length % 64) : (0);
j = (long)(length - cpys);
fseek(fh, -j, SEEK_END);
fread(addlp, 1, j, fh);
for (addlp[j++] = 128; j < addlsize; addlp[j++] = 0);
pp = addlp + addlsize - 8;
*((long long *)pp) = length << 3;
for (rewind(fh); 16 == fread(M, 4, 16, fh);)
MD5main
for (temp = addlp, ppend = addlp + addlsize; temp < ppend; temp += 16) {
for (i = 0; i < 16; M[i] = ((long*)temp)[i], i++);
MD5main
}
free(addlp);fclose(fh);
abcdtmp[0] = a, abcdtmp[1] = b, abcdtmp[2] = c, abcdtmp[3] = d;
for (addlp = (char*)abcdtmp, i = 0; i < 16; sprintf((md5 + 2 * i), "%02X", (unsigned char)addlp[i]), i++);
return md5;
}