当我从文件中执行MD5时,我得到了上面的错误(标题中)。在这种情况下,我通常可以处理32->64位转换issues..but的这种类型,我不知道我应该做什么,因为CC_MD5是CommonCrypto->CommonDigest
的一部分,这是一个随is 7.1附带的库。我假设[inputData length]
正在返回NSUInteger,这就是问题所在,但是我可以简单地从UL降到UI吗?如果文件很大,我可能会失去精确性。为什么苹果附带的库会要求int
使用64位能力的语言,比如iOS?是有人忽视了什么,还是我真的很愚蠢,错误地诊断了问题?
- (NSString*) getMD5FromFile:(NSString *)pathToFile {
unsigned char outputData[CC_MD5_DIGEST_LENGTH];
NSData *inputData = [[NSData alloc] initWithContentsOfFile:pathToFile];
CC_MD5([inputData bytes], [inputData length], outputData);
[inputData release];
NSMutableString *hash = [[NSMutableString alloc] init];
for (NSUInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", outputData[i]];
}
return [hash autorelease];
}
来自CommonCrypto->CommonDigest.h:
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)
我向苹果(#17256918)提交了错误报告,但难道没有办法做到这一点吗?
发布于 2014-10-09 22:16:59
您只需像您所怀疑的那样,将[inputData length]
转换为int
或uint32_t
。
如果要断言该数字不太大,则可以使用UINT32_MAX
进行检查。下面是一个您可以使用的NSAssert的示例。
NSAssert([inputData length] < UINT32_MAX, @"too big!");
发布于 2015-10-25 13:14:29
我不是专业人士,但我希望我没有犯大错。为了使代码比没有断言的强制转换更安全,您可以使用以下断言:
NSAssert([inputData length] <= (CC_LONG)-1, @"Input length is too big for unsigned CC_LONG type! Or CC_LONG became signed, which is unlikely");
这个变体更好,因为它不依赖于UINT32_MAX,因为将来可以更改CC_LONG。
当我几年前第一次看到这个技巧(CC_LONG)-1
时,我就疯了,直到我意识到它只是类型转换,而不是一个与sizeof
相关的复杂的C特性。因此,如果你与之斗争,这对你的大脑来说是一个巨大的解脱)
https://stackoverflow.com/questions/24148817
复制相似问题