iOS 7.1 CommonCrypto库抱怨:隐式转换失去整数精度:'NSUInteger'(无符号长整型)为CC_LONG(unsigned int)
我得到了上面的错误(在标题),而从文件做一个MD5 ..我通常可以应付这种types的32-> 64位转换问题..但在这种情况下,我不知道我该怎么做,因为CC_MD5是CommonCrypto->CommonDigest
,一个iOS7.1附带的库。 我假设[inputData length]
是返回NSUInteger,其中存在的问题,但是我可以简单地从UL下拉到UI? 如果文件很大,我可能会失去精度。 为什么苹果提供的图书馆需要使用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)
我提交了苹果的bug报告(#17256918),但没有办法做到这一点没有错误?
您只需要按照您的猜测将[inputData length]
转换为int
或uint32_t
。
如果你想断言这个数字对于types来说不是太大,你可以使用UINT32_MAX
来检查。 这里是你可以使用的一个NSAssert的例子。
NSAssert([inputData length] < UINT32_MAX, @"too big!");
我不是职业球员,但我希望自己没犯错。 为了使代码比仅仅声明没有断言更安全一些,你可以使用这个断言:
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将来可以改变。
PS在我几年前第一次看到这个技巧(CC_LONG)-1
,我发现这只是一个types转换,而不是一个与sizeof
相关的复杂C特性。 所以这对你的大脑来说是一个巨大的缓解,如果你努力的话)