首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS 7.1 CommonCrypto库抱怨:隐式转换失去整数精度:'NSUInteger‘(无符号长)到CC_LONG (无符号int)

iOS 7.1 CommonCrypto库抱怨:隐式转换失去整数精度:'NSUInteger‘(无符号长)到CC_LONG (无符号int)
EN

Stack Overflow用户
提问于 2014-06-10 18:55:32
回答 2查看 1.3K关注 0票数 4

当我从文件中执行MD5时,我得到了上面的错误(标题中)。在这种情况下,我通常可以处理32->64位转换issues..but的这种类型,我不知道我应该做什么,因为CC_MD5是CommonCrypto->CommonDigest的一部分,这是一个随is 7.1附带的库。我假设[inputData length]正在返回NSUInteger,这就是问题所在,但是我可以简单地从UL降到UI吗?如果文件很大,我可能会失去精确性。为什么苹果附带的库会要求int使用64位能力的语言,比如iOS?是有人忽视了什么,还是我真的很愚蠢,错误地诊断了问题?

代码语言:javascript
运行
复制
- (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:

代码语言:javascript
运行
复制
extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)

我向苹果(#17256918)提交了错误报告,但难道没有办法做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-09 22:16:59

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

如果要断言该数字不太大,则可以使用UINT32_MAX进行检查。下面是一个您可以使用的NSAssert的示例。

代码语言:javascript
运行
复制
    NSAssert([inputData length] < UINT32_MAX, @"too big!");
票数 3
EN

Stack Overflow用户

发布于 2015-10-25 13:14:29

我不是专业人士,但我希望我没有犯大错。为了使代码比没有断言的强制转换更安全,您可以使用以下断言:

代码语言:javascript
运行
复制
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特性。因此,如果你与之斗争,这对你的大脑来说是一个巨大的解脱)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24148817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档