2011-03-29 15 views
11

मैं एक शब्दकोश इतनी तरह प्रारंभ मिल गया है करने के लिए एक पूर्णांक परिवर्तित ...ऑब्जेक्टिव-सी एक हेक्स मान

keyDictionary = [[NSDictionary dictionaryWithObjects:values forKeys:keys]retain]; 

जहां keys वर्णमाला और अन्य पात्रों और values के NSArray है unsigned char के NSArray है एस, जो उन पात्रों के लिए यूएसबी हेक्स कीकोड हैं।

यूएसबी कुंजी कोड हेक्स मान हैं जो 0x04 से 0xE7 तक हैं। मैं कुंजीपटल पर कौन सी कुंजी दबाया जाता है, इस पर निर्भर करता हूं कि मैं इन दोनों के बीच एक नक्शा बनाने की कोशिश कर रहा हूं।

values सरणी इसलिए की तरह बनाई गई है ...

NSArray *values = [NSArray arrayWithObjects: 
        [NSNumber numberWithUnsignedChar:0x04]/*A*/, 
        [NSNumber numberWithUnsignedChar:0x05]/*B*/, /*ETC*/]; 

तो आदर्श जब मैं इस कोड को चलाने ... जहां character == @"I"

- (uint8) getUSBCode:(NSString *)character 
{ 
    NSNumber *val = [keyDictionary objectForKey:character]; 

    return (uint8)[val unsignedCharValue]; 
} 

मैं उम्मीद करेंगे वापस 0x0C प्राप्त करने के लिए है, लेकिन मुझे एक इंट के रूप में 12 वापस मिल रहा है (जो मैंने इसके बारे में सोचा, समझ में आता है)। मुझे हेक्स वैल्यू संरक्षित की जरूरत है। मुझे स्ट्रिंग मान की आवश्यकता नहीं है। मुझे हेक्स वैल्यू में सीधे रूपांतरण की आवश्यकता है या

uint8 स्टोर करने का एक बेहतर तरीका केवल एक टाइपिफ़ाइड हस्ताक्षरित char है।

संपादित करें जब मैंने इसे पहले पोस्ट किया था तो मुझे स्पष्ट नहीं था। मुझे वही चाहिए जो मुझे चाहिए।

मुझे इन कोडों के हेक्स मान की आवश्यकता है क्योंकि उन्हें आंतरिक कंपनी नेटवर्क पर भेजा जा रहा है। इसके अलावा, दबाए गए कुंजी का मूल्य बड़े एंडियन (या थोड़ा, यह अभी से मुझे बच रहा है) से दूसरे में परिवर्तित किया जा रहा है, फिर एक आंतरिक नेटवर्क पर प्रसारित किया जा रहा है। मैं समझता हूं कि ये मान बाइनरी में संग्रहीत हैं, लेकिन मुझे उन्हें हेक्स में प्रेषित करने की आवश्यकता है।

इसके अलावा, मैंने कहा कि मुझे समारोह से 12 वापस मिल रहा था। मैं डीबगर से 12 पढ़ रहा था, वास्तव में मूल्य नहीं प्राप्त कर रहा था। यही कारण है कि मैं उलझन में था।

+1

12 दशमलव और 0x0C समान संख्या हैं। आप वापसी मूल्य को 0x0C के साथ तुलना करने का प्रयास कर सकते हैं और देख सकते हैं कि वे समान हैं या नहीं।यानी 'अगर (retval == 0x0c) NSLog (@" वे वही हैं "); अन्य एनएसएलओजी (@ "वे वही नहीं हैं"); यूएसबी सीरियल पाइप को पारित करने वाली बिट्स दशमलव 12 या हेक्स सी के साथ समान होंगी ... 00001100 –

+0

आप सभी तकनीकी रूप से सही हैं। जब मैंने यह पूछा तो मैं कुल मूर्खतापूर्ण था। किसी कारण से मैंने माना कि मुझे हेक्स के रूप में कोड भेजना है, लेकिन अंत में, हम अनिवार्य रूप से बाइनरी भेज रहे हैं। – DavidAndroidDev

उत्तर

46

12 (आधार 10 में) 0x0c है।

यदि आप इसे हेक्स में प्रिंट करना चाहते हैं, तो %x प्रारूप विनिर्देशक का उपयोग करें उदा।

NSLog(@"Hex value of char is 0x%02x", (unsigned int) c); 

आप डीबगर में हेक्स में यह देखने के लिए चाहते हैं (Xcode 3.2.x कल्पना करते हुए) सही चर पर क्लिक करें और प्रारूप के रूप में हेक्साडेसिमल का चयन करें।

0

तुम्हें पता है कि एक पूर्णांक बाइनरी में संग्रहीत किया जाता है (जैसे 'हेक्स' मान हमेशा और कभी संरक्षित है), तो मैं स्क्रीन पर प्रिंट से संबंधित के रूप में अपने प्रश्न की व्याख्या कर रहा हूँ।
इसके लिए आपको format specifier का उपयोग करने में सक्षम होना चाहिए - %0x जैसे कुछ।

0

आपके -getUSBCode से वापस आने वाला मान: विधि दो दशमलव अंक नहीं है, यह एक आठ-बिट बाइट है। दोनों "12" और "0x0C" तार हैं जो बाइट के मान का प्रतिनिधित्व करते हैं, इसलिए कह रहे हैं कि आप "0x0C" चाहते हैं लेकिन नहीं चाहते कि स्ट्रिंग एक विरोधाभास है।

+0

आप सही हैं। मुझे लगता है कि मैं अपने प्रश्न में बहुत स्पष्ट नहीं था। इसे अभी संपादित करने जा रहे हैं। – DavidAndroidDev

संबंधित मुद्दे