उद्देश्य-सी पार्स हेक्स स्ट्रिंग से पूर्णांक तक


94

मैं जानना चाहूंगा कि ऑब्जेक्टिव-सी में एक संख्या का प्रतिनिधित्व करने वाले हेक्स स्ट्रिंग को कैसे पार्स किया जाए। मैं एक उद्देश्य या एक सी-आधारित पद्धति का उपयोग करने के लिए तैयार हूं, या तो ठीक है।

उदाहरण:

#01FFFFAB

पूर्णांक में पार्स करना चाहिए: 33554347

किसी भी सहायता की सराहना की जाएगी!

जवाबों:


169

जोक्सुआ वेनबर्ग का जवाब ज्यादातर सही है, हालांकि 0xहेक्साडेसिमल पूर्णांकों को स्कैन करते समय उपसर्ग वैकल्पिक है। यदि आपके पास प्रारूप में एक स्ट्रिंग है #01FFFFAB, तो आप अभी भी उपयोग कर सकते हैं NSScanner, लेकिन आप पहले वर्ण को छोड़ सकते हैं।

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#01FFFFAB"];

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];

1
धन्यवाद, वास्तव में मुझे क्या चाहिए!
रिचर्ड जे। रॉस III

ध्यान दें कि यदि आप सख्त पार्सिंग करना चाहते हैं, तो आपको पहले यह जांचना चाहिए कि स्ट्रिंग 0x(या 0X) से शुरू नहीं होती है । NSScanner उन उपसर्गों को स्वीकार करेगा।
क्रिस पेज

63

आप उपयोग कर सकते NSScanner इस के लिए

unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:@"0x01FFFFAB"];
[scanner scanHexInt:&outVal];

outValवह इंट शामिल होगा जिसकी आप तलाश कर रहे हैं। 0x वैकल्पिक है।


1
इसके अलावा, आप # वर्ण को 0x उपसर्ग में परिवर्तित करने के लिए एक स्ट्रिंग प्रतिस्थापन का उपयोग कर सकते हैं।
हॉटपावर 2

अहस्ताक्षरित int आउटवाल होना चाहिए;
wanghq

12

strtol () आपका मित्र है।

यह एक स्ट्रिंग को लंबे समय तक परिवर्तित करता है, और आप संख्या के आधार को पास कर सकते हैं। उस # पट्टी पर पहले हस्ताक्षर करें, या किसी सूचक को पहले संख्यात्मक वर्ण तक जाने के लिए पास करें।


1
मैं इस विधि के साथ जा रहा हूँ, एक सरल तरीका (और संभवतः तेज) एक nsscanner आवंटित करने की तुलना में।
क्रिस

1
@ क्रिस: यदि आपके पास एनएसएसट्रिंग है तो शायद यह जल्दी नहीं है, क्योंकि आपको स्ट्रेटोल का उपयोग करने से पहले एनएसएसट्रिंग को सी स्ट्रिंग में बदलना होगा। यदि आपके पास पहले से ही एक सी स्ट्रिंग में पाठ है, तो यह संभवत: तेज होगा, लेकिन जब तक आप ऐसा हजारों या लाखों बार कर रहे हैं मुझे संदेह है कि आप प्रदर्शन हिट महसूस करेंगे।
ड्रीमलैक्स

4
int Res = strtol ([yourString UTF8String], NULL, आधार)
loretoparisi

1
@dreamlax की परिभाषा - [NSString UTF8String] से पता चलता है कि यह बैकिंग UTF8 C स्ट्रिंग (NS_RETURNS_INNER_POINTER) को एक पॉइंटर लौटाता है। उच्च स्तर पर, यह NSScanner के लिए मेमोरी आवंटित करने के ओवरहेड बनाम इस कॉन्स्ट चर पॉइंटर को वापस करने के लिए केवल एक ही ऑपरेशन है, NSString इनपुट पैरामीटर की नकल करते हुए, प्रत्येक ObjC विधि आह्वान पर किए गए अतिरिक्त ObjC संदेश-पास विलंबता का उल्लेख नहीं करने के लिए। स्ट्रेटोएल () का उपयोग करने के लिए यह एल्गोरिदमिक रूप से बहुत तेज है, लेकिन आप तब तक अंतर का निरीक्षण नहीं करेंगे जब तक कि आप लाखों स्ट्रिंग्स से हेक्स पूर्णांक को स्कैन नहीं कर रहे हैं :-)
याकूब

1
strtolसमारोह भी एक बहुत अधिक उदार है। पूरी तरह से यूनिट परीक्षण (रिक्त स्थान, गैर-हेक्स वर्ण, आदि शामिल करें ..) लिखें क्योंकि आपको कुछ आश्चर्यजनक किनारे वाले मामले मिलेंगे जो NSScannerआपको अधिक नियंत्रण प्रदान करते हैं।
क्विंटन विलिसन

5

आप रूपांतरण के लिए नीचे की रेखा का उपयोग कर सकते हैं। इसका सिर्फ एक लाइन कोड है:

NSString *hexString = @"01FFFFAB";
length = (UInt64)strtoull([hexString UTF8String], NULL, 16);
NSLog(@"The required Length is %d", length);

हैप्पी कोडिंग !!!


ध्यान दें कि यदि आप सख्त पार्सिंग करना चाहते हैं, तो आपको पहले यह जांचना चाहिए कि स्ट्रिंग की शुरुआत 0x(या 0X) या +/- या किसी अन्य वर्ण से नहीं हुई है जिसे आपके इनपुट में मान्य नहीं माना गया है।
क्रिस पेज

2

स्विफ्ट 4 मानक पुस्तकालय ने सभी पूर्णांक प्रकारों को पार्स करने के लिए नया इनिशियलाइज़र पेश किया। यह मूल (यानी आधार) के साथ पार्स करने के लिए स्ट्रिंग लेता है और वैकल्पिक पूर्णांक देता है:

let number = Int("01FFFFAB", radix: 16)!

@ मर्जारोज़ा मैंने कुछ स्पष्टीकरण जोड़े
अलेक्जेंडर वासेन

0

सेब के अनुसार:

एक NSScanner ऑब्जेक्ट व्याख्या करता है और एक NSString ऑब्जेक्ट के वर्णों को संख्या और स्ट्रिंग मानों में परिवर्तित करता है।

तो, अगर आप के पास है तो NSDataआप अगले कर सकते हैं

NSString *dataDescription = data.description;
NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)];
unsigned intData = 0;
NSScanner *scanner = [NSScanner scannerWithString:dataAsString];
[scanner scanHexInt:&intData];

ध्यान दें कि यदि आप सख्त पार्सिंग करना चाहते हैं, तो आपको पहले यह देखना चाहिए कि स्ट्रिंग के साथ शुरू नहीं होता है 0x(या 0X) या कोई अन्य वर्ण जो आपके इनपुट में मान्य नहीं माना जाता है, लेकिन जिसे एनएसएसकेनर द्वारा स्वीकार किया जाता है।
क्रिस पेज

0

स्विफ्ट 3 के लिए:

var hex = "#01FFFFAB"
hex.remove(at: hex.startIndex)
var rgbValue:UInt32 = 0
Scanner(string: hex).scanHexInt32(&rgbValue)
// rgbValue == 33554347
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.