2009-07-25 9 views
22

Mam niepodpisaną długą długą wartość, którą chcę zapisać w NSString i pobrać z ciągu.Przechowywanie i pobieranie niepodpisanej długiej wartości długiej do/z NSString

Początkowo mają wartość w NSNumber i używam tego, aby uzyskać ciąg

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

gdzie myNum jest NSNumber.

Aby odzyskać NSNumber z NSString, muszę najpierw otrzymać niepodpisaną długą wartość. Ale nie ma metody w klasie NSString, aby to zrobić (mamy tylko jeden dla uzyskania długiej wartości długiej, a nie bez znaku długiej wartości).

Czy ktoś może mi powiedzieć, jak mogę odzyskać wartość do zmiennej NSNumber.

Dzięki.

Odpowiedz

56

Istnieje wiele sposobów, aby to osiągnąć. Poniżej znajduje się najbardziej pragmatyczne:

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); 

To sprawia, że ​​kilka rozsądnych założeń, takich jak numStr będzie zawierać tylko cyfry numerycznych i zawiera „ważny” unsigned long long wartość. Wadą tego podejścia jest to, że UTF8String tworzy to, co zasadniczo wynosi [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], lub innymi słowy, coś w rodzaju 32 bajtów autorejestrowanej pamięci na połączenie. W przypadku większości zastosowań nie stanowi to problemu.

Na przykład, jak dodać coś takiego unsignedLongLongValue do NSString który jest zarówno bardzo szybkie i nie używa autoreleased pamięci jako efekt uboczny, spojrzeć na końcu mojego (długi) odpowiedzi na this SO question. W szczególności przykładowa implementacja rklIntValue, która wymagałaby jedynie drobnych modyfikacji w celu implementacji unsignedLongLongValue. Więcej informacji na temat strtoull można znaleźć na stronie man.

+1

Doskonała odpowiedź. Możesz także po prostu odczytać znaki w lokalnym tymczasowym łańcuchu C (ponieważ wszystkie znaki są cyframi, nie ma problemów z kodowaniem UTF-8 lub Unicode), a następnie użyć polecenia strtoull, który pozwoliłby uniknąć opisanej wady, ale byłby to bardzo dziwny przypadek, w którym twoja wada była faktycznym problemem w praktyce. –

+0

nie ma metody unsignedLongLongValue dla obiektu NSString – Gargo

+0

Aby zażądać pomocy w czytaniu niepodpisanych wartości z NSString, odwiedź http://bugreport.apple.com i zgłoś duplikat: // 2264733 przeciwko komponentowi 'Foundation | X'. –

Powiązane problemy