Подтвердить что ты не робот

Objective-C Неявное преобразование теряет целую точность (size_t to CC_Long)

У меня есть функция, которая генерирует шифрование sha256 строки,

Здесь функция:

    -(NSString*)sha256HashFor:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

Теперь эта строка здесь CC_SHA256(str, strlen(str), result); - это то, что создает это предупреждение (предупреждение для переменной strlen (str)).

Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'CC_LONG' (aka 'unsigned int')

Я предполагаю, что мне просто нужно преобразовать strlen (str) в CC_Long, но я понятия не имею, как это сделать.

4b9b3361

Ответ 1

  • Предположительно, это не ошибка, а предупреждение.

  • "Мне просто нужно преобразовать strlen (str) в CC_Long, но я не знаю, как это сделать". - явное преобразование типа (тип casting): (CC_LONG)strlen(str), но я не думаю, что вам это действительно нужно.

Ответ 2

Говоря с точки зрения iOS, тот факт, что CC_LONG (a.k.a. uint32_t) и size_t (unsigned long) являются несовместимыми размерами, может быть проблемой безопасности/стабильности в некоторых приложениях, особенно при работе с библиотечными функциями многократного использования.

Хэш MD5 представляет собой 128-битный хэш сообщения с потенциально неограниченной длиной, поэтому есть веская причина для этого предупреждения. Если вы усекаете длину больше 2 ^ 32, вы получите неправильный хеш.

Ваш код должен логически решить, насколько большой размер строки он может поддерживать. В этом случае с использованием CC_MD5 это должно быть 2 ^ 32 байта.

Максимальная длина для ввода/вывода MD5

Ответ 3

Этот код не будет показывать никаких предупреждений и работает отлично.

- (NSString*) sha256 {
    const char * pointer = [self UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(pointer, (CC_LONG)strlen(pointer), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

Ответ 4

измените int i на NSUInteger i, чтобы отключить предупреждение,