簡體   English   中英

iOS 7.1 CommonCrypto庫抱怨:隱式轉換失去整數精度:'NSUInteger'(無符號長整型)到CC_LONG(unsigned int)

[英]iOS 7.1 CommonCrypto library complains: Implicit conversion loses integer precision: 'NSUInteger' (unsigned long) to CC_LONG (unsigned int)

我從文件中執行MD5時得到上述錯誤(標題中)..我通常可以應對這些類型的32-> 64位轉換問題..但在這種情況下,我不知道我應該做什么,因為CC_MD5是一部分CommonCrypto->CommonDigest ,iOS7.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),但沒有錯誤的方法可以做到這一點嗎?

您只需要將[inputData length]轉換為intuint32_t如您[inputData length]

如果要斷言該數字對於類型而言不是太大,可以使用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時發瘋了,之前我意識到它只是類型轉換而不是與sizeof相關的復雜C功能。 如果你掙扎,這對你的大腦是一個巨大的緩解)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM