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, но я понятия не имею, как это сделать.
Ответы
Ответ 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
, чтобы отключить предупреждение,