继续上次的话题,一般大文件下载下来,为了确定这个文件是否下载有误,或者检查此文件在下载过程中有没有损坏,我们需要进行的一步安全性操作就是大文件的MD5加密,用你加密的字符串,和源文件的md5字符串进行校验,看是否一样。今天,我就简单介绍一种大文件的MD5加密的方法。
话不多说,上代码:
//MARK:大文件的MD5加密
-(NSString*)fileMD5:(NSString*)path
{
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
if( handle== nil ) return @"ERROR GETTING FILE MD5"; // file didnt exist
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
BOOL done = NO;
while(!done)
{
NSData* fileData = [handle readDataOfLength:256];
// CHUNK_SIZE
CC_MD5_Update(&md5, [fileData bytes], [fileData length]);
if( [fileData length] == 0 ) done = YES;
}
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(digest, &md5);
NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
digest[0], digest[1],
digest[2], digest[3],
digest[4], digest[5],
digest[6], digest[7],
digest[8], digest[9],
digest[10], digest[11],
digest[12], digest[13],
digest[14], digest[15]];
return s;
}
以上是加密需要调用的一个方法,接下来是具体加密的使用。
NSString * resultMD5 = [self fileMD5:md5Path];
//对比MD5
localMd5 = [NSString stringWithFormat:@"%@",[self analysisXMLFiles:FileName]];
NSLog(@"resultMD5=%@,localMD5=%@",resultMD5,localMd5);
if ([localMd5 isEqualToString:resultMD5]) {
NSLog(@"md5校验正确");
}else{
NSLog(@"md5校验错误");
}
说明:其中的md5Path就是需要加密的文件路径。