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

Хранение и получение беззнакового длинного длинного значения в/из NSString

У меня есть unsigned long long значение, которое я хочу сохранить в NSString и извлечь из строки.

Изначально у меня есть значение в NSNumber, и я использую это, чтобы получить строку

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

где myNum - NSNumber.

Чтобы вернуть NSNumber из NSString, я должен сначала получить значение unsigned long long. Но в классе NSString нет метода для этого (у нас есть только один для получения длинного длинного значения, а не без знакового длинного значения).

Может кто-нибудь, пожалуйста, скажите мне, как я могу вернуть значение в переменную NSNumber.

Спасибо.

4b9b3361

Ответ 1

Есть много способов сделать это. Наиболее прагматичным является следующее:

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

// .. code and time in between when numStr was created
// .. and now needs to be converted back to a long long.
// .. Therefore, numStr used below does not imply the same numStr above.

unsigned long long ullvalue = strtoull([numStr UTF8String], NULL, 0);

Это делает несколько разумных предположений, таких как numStr, будет содержать только числовые цифры и содержит "действительное" значение unsigned long long. Недостатком этого подхода является то, что UTF8String создает то, что по существу составляет [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], или, другими словами, что-то в строках 32 байта автореализованной памяти за вызов. Для подавляющего большинства применений это не проблема, что-то никогда.

Пример того, как добавить что-то вроде unsignedLongLongValue в NSString, которое является очень быстрым и не использует память с автореализацией в качестве побочного эффекта, взгляните на конец моего (длинного) ответа на этот вопрос SO. В частности, пример реализации rklIntValue, который потребует только тривиальных модификаций для реализации unsignedLongLongValue.

Более подробную информацию о strtoull можно найти на странице руководства.