Эффективно преобразовать шестнадцатеричную строку в целое число в C? - PullRequest
22 голосов
/ 14 августа 2008

В C, какой самый эффективный способ преобразовать строку шестнадцатеричных цифр в двоичный файл unsigned int или unsigned long?

Например, если у меня есть 0xFFFFFFFE, я хочу int со значением base10 4294967294.

Ответы [ 15 ]

1 голос
/ 19 декабря 2010

Попробуйте преобразовать десятичное значение в шестнадцатеричное.

    #include<stdio.h>
    #include<conio.h>

    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;
}
1 голос
/ 23 августа 2008

Почему кодовое решение работает быть отвергнутым? Конечно это некрасиво ...

Возможно, потому что, будучи некрасивым, это не воспитательно и не работает. Кроме того, я подозреваю, что, как и я, большинство людей в настоящее время не имеют прав для редактирования (и, судя по необходимому разряду - никогда не будет).

Использование массива может быть полезно для эффективности, но это не упоминается в этом коде. Он также не учитывает прописные и строчные буквы, поэтому он не работает для примера, приведенного в вопросе. FFFFFFFE

1 голос
/ 14 августа 2008

@ Эрик

На самом деле я надеялся увидеть, как волшебник С публикует что-то действительно классное, вроде того, что я делал, но менее многословно, хотя все еще делал это "вручную".

Ну, я не гуру C, но вот что я придумал:

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 голосов
/ 19 июля 2017

В C вы можете преобразовать шестнадцатеричное число в десятичное во многих отношениях. Одним из способов является приведение шестнадцатеричного числа к целому числу. Я лично нашел это простым и маленьким.

Вот пример кода для преобразования шестнадцатеричного числа в десятичное число с помощью приведения.

#include <stdio.h>

int main(){
    unsigned char Hexadecimal = 0x6D;   //example hex number
    int Decimal = 0;    //decimal number initialized to 0


        Decimal = (int) Hexadecimal;  //conversion

    printf("The decimal number is %d\n", Decimal);  //output
    return 0;
}
0 голосов
/ 29 октября 2010

В настоящее время это работает только в нижнем регистре, но его очень легко заставить работать с обоими.

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

strlength = hexNumber.length();

for (i=0;i<strlength;i++)
{
    hexa = hexNumber.substr(i,1);
    if ((hexa>="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";
...