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]转换为intuint32_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特性。 所以这对你的大脑来说是一个巨大的缓解,如果你努力的话)

Interesting Posts