我正在构建一个应用程序,我需要从文件中找到校验和。
到目前为止,我已经成功地通过将文件加载到NSData对象并使用以下代码来获取校验和:
@implementation NSData (Checksums)
- (NSString*)md5 {
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( self.bytes, (int)self.length, result );
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
但是,当我尝试从大于可用内存的文件(例如8GB RAM和20GB文件)中获取校验和时,此解决方案无效,因为我无法将整个文件加载到对象
有没有办法从文件中获取校验和,而无需将文件加载到NSData对象中?
答案 0 :(得分:0)
您必须使用CC_MD5_Init
,CC_MD5_Update
和CC_MD5_Final
这两项功能。您只需拨打CC_MD5_Init
一次,然后将数据块传递给CC_MD5_Update
,直到您完成该文件为止。然后调用CC_MD5_Final
以获取文件的MD5校验和。
要阅读部分文件,请使用[NSFileHandle readDataOfLength:]
。
如果您需要延迟解决方案,还可以使用NSTask
运行命令行工具md5
。