iOS 7.1 CommonCrypto 库提示 : Implicit conversion loses integer precision: 'NSUInteger' (unsigned long) to CC_LONG (unsigned int)

标签 ios objective-c 64-bit md5 precision

我在从文件执行 MD5 时遇到上述错误(在标题中)。我通常可以处理这些类型的 32->64 位转换问题。但在这种情况下,我不知道我应该怎么做CC_MD5 是 CommonCrypto->CommonDigest 的一部分,这是一个 iOS7.1 附带的库。我假设 [inputData length] 正在返回 NSUInteger 并且这就是问题所在,但是我可以简单地从 UL 转换为 UI 吗?如果文件很大,我可能会失去精度。为什么 Apple 附带的库需要使用支持 64 位的语言(例如 iOS)的 int?是有人忽略了什么,还是我真的很愚蠢,误诊了问题?

- (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)

我向 apple (#17256918) 提交了错误报告,但是没有办法做到这一点而不会出现错误吗?

最佳答案

您只需将 [inputData length] 转换为您所怀疑的 intuint32_t

如果您想断言该数字对于类型而言不是太大,您可以使用 UINT32_MAX 进行检查。这是您可以使用的 NSAssert 示例。

    NSAssert([inputData length] < UINT32_MAX, @"too big!");

关于iOS 7.1 CommonCrypto 库提示 : Implicit conversion loses integer precision: 'NSUInteger' (unsigned long) to CC_LONG (unsigned int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24148817/

相关文章:

ios - iOS应用内购买

iphone - 带字体大小 :constrainedToSize:lineBreakMode deprecated

ios - 如何格式化字符串左对齐

iphone - performSelector 在所有实例上进入方法,但只有一个线程完成

python - 共享 64 位 python 安装

ios - 如何用手指移动 Sprite ?

objective-c - 如何将多对多关系绑定(bind)到tableview?

ios - 使用 use_frameworks 时 react-native-maps iOS 构建问题! :linkage => :static

wcf - 将 .NET 4 WCF 服务定位为 64 位的问题

r - 我如何知道 R 是在 64 位还是 32 位上运行?