2009-07-25 16 views
22

से हस्ताक्षरित लंबे लंबे मूल्य को संग्रहीत और पुनर्प्राप्त करना मेरे पास एक हस्ताक्षरित लंबा लंबा मूल्य है जिसे मैं एनएसएसटींग में स्टोर करना चाहता हूं और स्ट्रिंग से पुनर्प्राप्त करना चाहता हूं।एनएसएसटींग

शुरू में मैं एक NSNumber में मूल्य है और मैं इस का उपयोग कर रहा स्ट्रिंग

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

जहां myNum एक NSNumber है पाने के लिए।

एनएसएसटींग से एनएसएनंबर वापस पाने के लिए मुझे पहले हस्ताक्षर किए गए लंबे लंबे मूल्य प्राप्त करना होगा। लेकिन ऐसा करने के लिए एनएसएसटींग कक्षा में कोई विधि नहीं है (हमारे पास लंबे समय तक लंबे मूल्य प्राप्त करने के लिए कोई है, न कि हस्ताक्षरित लंबे लंबे मूल्य के लिए)।

क्या कोई मुझे बता सकता है कि मैं एनएसएनंबर चर में मूल्य कैसे वापस प्राप्त कर सकता हूं।

धन्यवाद।

उत्तर

56

इसे पूरा करने के कई तरीके हैं। पीछा कर रहा है सबसे व्यावहारिक:

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 के रूप में कुछ उचित मान्यताओं केवल अंक में शामिल होंगे बनाता है और यह एक 'वैध' अहस्ताक्षरित लंबे मान है। इस दृष्टिकोण में एक कमी यह है कि UTF8String बनाता है जो [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes] के लिए अनिवार्य रूप से रकम बनाता है, या दूसरे शब्दों में प्रति कॉल स्वत: स्मृति स्मृति के 32 बाइट्स के साथ कुछ है। उपयोग के विशाल बहुमत के लिए, यह अब तक कोई समस्या नहीं है।

कैसे NSString को unsignedLongLongValue की तरह कुछ दोनों बहुत तेज है और एक पक्ष प्रभाव के रूप में कोई autoreleased स्मृति का उपयोग करता है जोड़ने के लिए का एक उदाहरण के लिए, मेरे (लंबी) this SO question का जवाब के अंत में एक बार देख ले। विशेष रूप से rklIntValue का उदाहरण कार्यान्वयन, जिसके लिए unsignedLongLongValue लागू करने के लिए केवल मामूली संशोधन की आवश्यकता होगी।

strtoull के बारे में अधिक जानकारी इसके मैन पेज में मिल सकती है।

+1

उत्कृष्ट उत्तर। आप स्थानीय अस्थायी सी स्ट्रिंग में वर्णों को भी पढ़ सकते हैं (चूंकि वर्ण सभी अंक हैं, कोई यूटीएफ -8 या यूनिकोड समस्या नहीं है) और फिर स्ट्रेटौल का उपयोग करें जो वर्णित दोष से बचें, लेकिन यह बहुत होगा अजीब मामला जहां आपका दोष अभ्यास में एक वास्तविक मुद्दा था। –

+0

एनएसएसटींग ऑब्जेक्ट – Gargo

+0

के लिए कोई हस्ताक्षरित नहीं है LongLongValue विधि NSString से हस्ताक्षरित मान पढ़ने के लिए समर्थन का अनुरोध करने के लिए, कृपया http://bugreport.apple.com पर जाएं और रडार का डुप्लिकेट करें: // 2264733 घटक 'फाउंडेशन के खिलाफ | X'। –