एक हेक्साडेसिमल स्ट्रिंग को सी में कुशलतापूर्वक एक पूर्णांक में कनवर्ट करें?

सी में, हेक्स अंकों की एक स्ट्रिंग को बाइनरी unsigned int या unsigned long में परिवर्तित करने का सबसे प्रभावी तरीका क्या है?

उदाहरण के लिए, यदि मेरे पास 0xFFFFFFFE है, तो मुझे आधार 10 मान 4294967294 के साथ int चाहिए।

0
ro fr bn

9 उत्तर

इसे इस्तेमाल करे:

#include 
int main()
{
    char s[] = "fffffffe";
    int x;
    sscanf(s, "%x", &x);
    printf("%u\n", x);
}
0
जोड़ा
यह शानदार है। मैंने पहले कभी इस विधि को नहीं देखा।
जोड़ा लेखक Cloud Cho, स्रोत

You want strtol or strtoul. See also the Unix man page

0
जोड़ा

एक कोड समाधान क्यों काम करता है   मतदान हो रहा है? निश्चित रूप से, यह बदसूरत है   ...

शायद क्योंकि बदसूरत होने के नाते यह शैक्षिक नहीं है और नहीं काम करता है। साथ ही, मुझे संदेह है कि मेरे जैसे, ज्यादातर लोगों के पास वर्तमान में संपादित करने की शक्ति नहीं है (और आवश्यक रैंक द्वारा निर्णय - कभी नहीं होगा)।

एक सरणी का उपयोग दक्षता के लिए अच्छा हो सकता है, लेकिन इस कोड में इसका उल्लेख नहीं है। इसमें ऊपरी और निचले मामले का कोई भी खाता नहीं है, इसलिए यह प्रश्न में दिए गए उदाहरण के लिए काम नहीं करता है। FFFFFFFE

0
जोड़ा

@Eric

एक कोड समाधान क्यों है जो मतदान करने के लिए काम करता है? निश्चित रूप से, यह बदसूरत है और ऐसा करने का सबसे तेज़ तरीका नहीं हो सकता है, लेकिन यह अधिक निर्देशक है कि "स्ट्रेटोल" या "एसएसकेएनएफ" कह रहा है। यदि आप इसे स्वयं आज़माते हैं तो आप कुछ सीखेंगे कि चीजें हुड के नीचे कैसे होती हैं।

मुझे सच में नहीं लगता कि आपका समाधान वोट दिया जाना चाहिए था, लेकिन मेरा अनुमान है कि यह क्यों हो रहा है क्योंकि यह कम व्यावहारिक है। मतदान के साथ विचार यह है कि "सर्वश्रेष्ठ" उत्तर शीर्ष पर तैर जाएगा, और जब आपका उत्तर हुड के तहत क्या होता है (या जिस तरह से हो सकता है) के बारे में अधिक निर्देशक हो सकता है, तो यह निश्चित रूप से हेक्स संख्याओं को पार्स करने का सबसे अच्छा तरीका नहीं है एक उत्पादन प्रणाली में।

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

मुझे संदेह है कि मेरा जवाब आपको वोट देने के बारे में बेहतर महसूस करता है, लेकिन मुझे पता है कि यह विशेष रूप से मजेदार नहीं है जब आप पूछते हैं कि कुछ क्यों मतदान किया जा रहा है और कोई भी जवाब नहीं देता

0
जोड़ा
अगस्त 2008 में साइट नई थी और टिप्पणियां लागू नहीं की गईं
जोड़ा लेखक Derek Park, स्रोत
-1 एक कारण है कि हमारे पास टिप्पणियां हैं ...
जोड़ा लेखक alternative, स्रोत

@Eric

मैं वास्तव में एक सी विज़ार्ड पोस्ट को वास्तव में ठंडा करने की उम्मीद कर रहा था, जैसा कि मैंने किया था, लेकिन कम वर्बोज़ की तरह, अभी भी इसे "मैन्युअल" कर रहा है।

खैर, मैं कोई सी गुरु नहीं हूं, लेकिन यहां मैं इसके साथ आया हूं:

unsigned int parseHex(const char * str)
{
    unsigned int val = 0;
    char c;

    while(c = *str++)
    {
        val <<= 4;

        if (c >= '0' && c <= '9')
        {
            val += c & 0x0F;
            continue;
        }

        c &= 0xDF;
        if (c >= 'A' && c <= 'F')
        {
            val += (c & 0x07) + 9;
            continue;
        }

        errno = EINVAL;
        return 0;
    }

    return val;
}

मूल रूप से तुलना करने के बजाए मुझे अधिक बिटकमास्किंग चल रही थी, लेकिन मुझे गंभीरता से संदेह है कि बिटकमास्किंग आधुनिक हार्डवेयर की तुलना में तेज है।

0
जोड़ा
क्या तुमने इसे पढ़ा? "मैंने वास्तव में इसे संकलित नहीं किया था, इसलिए मैं कुछ बड़ी गलतियों को कर सकता था।" तो नहीं, मैंने इसका परीक्षण नहीं किया।
जोड़ा लेखक Derek Park, स्रोत
तुम वहाँ जाओ। मैंने इसे दबाया। रिकॉर्ड के लिए, यह पहले से ही "सी और = 0xDF" कथन के माध्यम से कम मामला संभाला है। हालांकि, यह कई अन्य तरीकों से टूट गया था।
जोड़ा लेखक Derek Park, स्रोत
चार शिकायतें: 1) यह संकलित नहीं है। 2) आईडी कम मामला संभाल नहीं करता है 3) यह काम नहीं करता है (ए => 1)। 4) अमान्य वर्णों को सिर्फ अनदेखा कर दिया गया है! क्या आपने इसका परीक्षण किया?
जोड़ा लेखक Martin York, स्रोत
पांचवीं शिकायत: यदि आप एएनएसआई सी में प्रोग्राम करते हैं (और एएससीआईआई-आधारित निष्पादन चरित्र सेट होने की गारंटी नहीं है), तो कोई गारंटी नहीं है कि 'ए' + 1 == 'बी' या वह < कोड> ('ए' और 0xDF) == ('ए' और 0xDF) ।
जोड़ा लेखक Roland Illig, स्रोत

जैसे-जैसे होता है, आपका प्रश्न गंभीर शब्दावली त्रुटि/अस्पष्टता से पीड़ित होता है। आम भाषण में यह आमतौर पर कोई फर्क नहीं पड़ता, लेकिन इस विशिष्ट समस्या के संदर्भ में यह महत्वपूर्ण रूप से महत्वपूर्ण है।

आप देखते हैं, "हेक्स मान" और "दशमलव मान" (या "हेक्स संख्या" और "दशमलव संख्या") जैसी कोई चीज़ नहीं है। "हेक्स" और "दशमलव" मानों के प्रतिनिधित्व के गुण हैं। इस बीच, मूल्यों (या संख्याओं) के पास स्वयं का कोई प्रतिनिधित्व नहीं है, इसलिए वे "हेक्स" या "दशमलव" नहीं हो सकते हैं। उदाहरण के लिए, सी वाक्यविन्यास में 0xF और 15 समान संख्या के दो अलग-अलग प्रतिनिधित्व हैं।

मुझे लगता है कि आपका प्रश्न, जिस तरह से कहा गया है, यह बताता है कि आपको एक मूल्य (यानी एक स्ट्रिंग) के ASCII हेक्स प्रस्तुति को एक मूल्य (एक और स्ट्रिंग) के ASCII दशमलव प्रतिनिधित्व में परिवर्तित करने की आवश्यकता है। ऐसा करने का एक तरीका एक इंटरमीडिएट के रूप में एक पूर्णांक प्रतिनिधित्व का उपयोग करना है: सबसे पहले, एएससीआईआई हेक्स प्रतिनिधित्व को पर्याप्त आकार के पूर्णांक में परिवर्तित करें ( strto ... समूह से फ़ंक्शंस का उपयोग करके, strtol ), फिर पूर्णांक को ASCII दशमलव प्रतिनिधित्व में परिवर्तित करें ( sprintf का उपयोग करके)।

यदि ऐसा नहीं है जो आपको करने की ज़रूरत है, तो आपको अपने प्रश्न को स्पष्ट करना होगा, क्योंकि आपके प्रश्न के तरीके से इसे समझना असंभव है।

0
जोड़ा
मैं हेक्स स्ट्रिंग -> दशमलव स्ट्रिंग के रूप में प्रश्न भी पढ़ता हूं, लेकिन यह अन्य उत्तरों से मेल नहीं खाता है। मैंने स्वीकार्य उत्तर और अधिकतर उत्तरों से मेल खाने के लिए प्रश्न संपादित किया। स्ट्रिंग-> स्ट्रिंग प्रश्न अस्पष्ट है, लेकिन मुझे आश्चर्य होता है कि यह एक मध्यवर्ती चरण के रूप में बाइनरी पूर्णांक के बिना बिना किया जा सकता है (उदाहरण के लिए uint64_t में फ़िट होने के लिए बहुत बड़ी संख्या के लिए)। दशमलव अंकों की एक स्ट्रिंग को जोड़ने के साथ-साथ बहुत कुछ बेकार है, हालांकि, शायद नहीं।
जोड़ा लेखक Peter Cordes, स्रोत

यह वर्तमान में केवल कम मामले के साथ काम करता है लेकिन यह दोनों के साथ काम करने के लिए यह बहुत आसान है।

cout << "\nEnter a hexadecimal number: ";
cin >> hexNumber;
orighex = hexNumber;

strlength = hexNumber.length();

for (i=0;i="0") && (hexa<="9"))
    {
        //cout << "This is a numerical value.\n";
    }
    else
    {
        //cout << "This is a alpabetical value.\n";
        if (hexa=="a"){hexa="10";}
        else if (hexa=="b"){hexa="11";}
        else if (hexa=="c"){hexa="12";}
        else if (hexa=="d"){hexa="13";}
        else if (hexa=="e"){hexa="14";}
        else if (hexa=="f"){hexa="15";}
        else{cout << "INVALID ENTRY! ANSWER WONT BE CORRECT\n";}
    }
    //convert from string to integer

    hx = atoi(hexa.c_str());
    finalhex = finalhex + (hx*pow(16.0,strlength-i-1));
}
cout << "The hexadecimal number: " << orighex << " is " << finalhex << " in decimal.\n";
0
जोड़ा

डेसिमल से हेक्स में कनवर्ट करने के लिए इसे आजमाएं

    #include
    #include

    int main(void)
    {
      int count=0,digit,n,i=0;
      int hex[5];
      clrscr();
      printf("enter a number   ");
      scanf("%d",&n);

      if(n<10)
      {
          printf("%d",n);
      }

      switch(n)
      {
          case 10:
              printf("A");
            break;
          case 11:
              printf("B");
            break;
          case 12:
              printf("B");
            break;
          case 13:
              printf("C");
            break;
          case 14:
              printf("D");
            break;
          case 15:
              printf("E");
            break;
          case 16:
              printf("F");
            break;
          default:;
       }

       while(n>16)
       {
          digit=n%16;
          hex[i]=digit;
          i++;
          count++;
          n=n/16;
       }

       hex[i]=n;

       for(i=count;i>=0;i--)
       {
          switch(hex[i])
          {
             case 10:
                 printf("A");
               break;
             case 11:
                 printf("B");
               break;
             case 12:
                 printf("C");
               break;
             case  13:
                 printf("D");
               break;
             case 14:
                 printf("E");
               break;
             case 15:
                 printf("F");
               break;
             default:
                 printf("%d",hex[i]);
          }
    }

    getch();

    return 0;
}
0
जोड़ा
दशमलव-> हेक्स आसान है: आप एक विशाल स्विच के बिना, 4 बिट पूर्णांक से हेक्स अंकों में कनवर्ट करने के लिए तालिका लुकअप का उपयोग कर सकते हैं। char hextable [] = {'0', '1', ..., 'ए', 'बी', ..., 'एफ'}; और आप putchar का उपयोग कर सकते हैं printf के बजाय ! साथ ही, आपके पहले स्विच में एक बग है: "B" 11 और 12 के लिए है, यही कारण है कि 16-> "F" ।/facepalm
जोड़ा लेखक Peter Cordes, स्रोत

हेक्साडेसिमल दशमलव तक। इसे ऑनलाइन कंपाइलर्स पर न चलाएं, क्योंकि यह काम नहीं करेगा।

#include
void main()
{
    unsigned int i;
    scanf("%x",&i);
    printf("%d",i);
}
0
जोड़ा