문제

C 에서는 무엇이 가장 효율적인 방법을 변환할 문자열의 진수 숫자로 바이너리 unsigned intunsigned long?

예를 들어,가 있는 경우 0xFFFFFFFE, 그 int 으로 10 진법으로 값 4294967294.

도움이 되었습니까?

해결책

다른 팁

편집: 지금 호환 MSVC,C++및 비 GNU 컴파일러십시오(최종).

는 질문에는"가장 효율적인 방법입니다." 영업 이익을 지정하지 않는 플랫폼,그가 될 수 있는 컴파일을 위한 RISC 기반 ATMEL 칩 256 바이트의 플래시 저장을 위해 자신의 코드입니다.

에 대한 기록,그리고(나 같은),주셔서 감사 사이의 차이"가장 쉬운 방법"및"가장 효율적인 방법으로",그리고 사람을 즐길 수 있습니다.

static const long hextable[] = {
   [0 ... 255] = -1, // bit aligned access into this table is considerably
   ['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // faster for most modern processors,
   ['A'] = 10, 11, 12, 13, 14, 15,       // for the space conscious, reduce to
   ['a'] = 10, 11, 12, 13, 14, 15        // signed char.
};

/** 
 * @brief convert a hexidecimal string to a signed long
 * will not produce or process negative numbers except 
 * to signal error.
 * 
 * @param hex without decoration, case insensitive. 
 * 
 * @return -1 on error, or result (max (sizeof(long)*8)-1 bits)
 */
long hexdec(unsigned const char *hex) {
   long ret = 0; 
   while (*hex && ret >= 0) {
      ret = (ret << 4) | hextable[*hex++];
   }
   return ret; 
}

그것은 필요하지 않은 외부 라이브러리,그리고 그것이 있어야 눈부시게 빠릅니다.을 처리하는 대문자,대문자,잘못된 문자,크기의 진수 입력을(예를 들어:0xfff)이며 최대 크기로만 제한하지 않습니다.

비 GCC 또는 C++컴파일러 또는 컴파일러는 것입니다 받아들이지 않는 멋진 hextable 선언입니다.

대체는 첫 번째 문 이(이하지만,더 따)버전:

static const long hextable[] = { 
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1, 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
};

이것을 보십시오:

#include <stdio.h>
int main()
{
    char s[] = "fffffffe";
    int x;
    sscanf(s, "%x", &x);
    printf("%u\n", x);
}

지 않는 경우가 있 stdlib 당신은 그것을 할 수 있습니다.

unsigned long hex2int(char *a, unsigned int len)
{
    int i;
    unsigned long val = 0;

    for(i=0;i<len;i++)
       if(a[i] <= 57)
        val += (a[i]-48)*(1<<(4*(len-1-i)));
       else
        val += (a[i]-55)*(1<<(4*(len-1-i)));

    return val;
}

참고:이 코드에서는 대문자 A-F.그것은 작동하지 않는 경우 렌을 넘어서 가장 긴 정수 32 또는 64 비트,그리고 오류가 없습니다 트래핑에 대한 불법 육 문자입니다.

For AVR 마이크로컨트롤러를 썼는데 다음과 같은 기능을 포함하여,관련 의견을 이해하기 쉽게 만들기:

/**
 * hex2int
 * take a hex string and convert it to a 32bit number (max 8 hex digits)
 */
uint32_t hex2int(char *hex) {
    uint32_t val = 0;
    while (*hex) {
        // get current character then increment
        char byte = *hex++; 
        // transform hex character to the 4bit equivalent number, using the ascii table indexes
        if (byte >= '0' && byte <= '9') byte = byte - '0';
        else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
        else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;    
        // shift 4 to make space for new digit, and add the 4 bits of the new digit 
        val = (val << 4) | (byte & 0xF);
    }
    return val;
}

예제:

char *z ="82ABC1EF";
uint32_t x = hex2int(z);
printf("Number is [%X]\n", x);

출력됩니다:enter image description here

으로는 경우가 종종 발생,당신의 질문을 앓고 심각한 용어 오류가/모호성.에서 일반적인 연설을 그것은 일반적으로 중요하지 않지만,의 컨텍스트에서 이 특정한 문제가 매우 중요합니다.

당신이 볼 수 있을 것으로"진수 값을"및"소수 값을"(또는"진수 숫자"및"진수")."Hex"및"소수"의 속성 표현 의 값이 있습니다.한편,가치(숫자)에 의해 자신이 없는 표현은,그래서 그들은 수 없습니다"진수"또는"진수".예를 들어, 0xF15 C 문은 서로 다른 두 표현동일 번호.

내가 생각하는 당신의 질문에 이 방법을 명시되어 제시하는 변환해야 합 ASCII hex 값의 표현(i.e문자열)으로 ASCII 진수 값의 표현(다른 문자열).하는 방법 중 하나는 정수를 사용하여 표현으로 중 하나:첫 번째,변환 ASCII hex 표현하는 정수로 충분한 크기(기능을 사용하여서 strto... 그룹,아 strtol음)변환이 정수로 ASCII 소수 대표(사용 sprintf).

하지 않을 경우 무엇을 할 필요가 있음을 명확하게 질문하기 것은 불가능하기 때문에 그것을 파악하는 방법에서 당신의 질문이 되었습니다.

@에릭

이유 코드를 작동 하는 솔루션을 받고 투표가?확실히,그것의 추악지 않을 수 있습니다 가장 빠른 방법으로 할,하지만 그것이 더 많은 교훈을 말하는"strtol"또는"sscanf".는 경우에 당신은 그것을 자신을 시도하고 당신이 뭔가를 배우는 방법에 대한 것을 발생합니다.

나는 진짜로 생각하지 않는 솔루션을 해야 선정 되었습니다,그러나 내 생각으로 그것이 왜 일어나는 일이기 때문에 그것의 실용성이 저하됩니다.아이디어와 함께 투표는"최고의"답은 정상에 떠있는 것,그리고는 동안 당신의 대답이는 것이 더 유익한 일어나는 일에 대한 후드(또는 방법으로 일어날 수 있습),그것은 확실히지 않는 최선의 방법은 분석 진수 숫자에 생산 시스템입니다.

다시 생각하지 않기에 아무 잘못으로 응답에서는 교육적 관점에서,그리고 나는 확실히지 않을 것(지 않았)투표니다.낙심하지 않고 중지시기 때문에 단지 어떤 사람 좋아하지 않았다 하나의 답변이 있습니다.그것은 발생합니다.

나는 의혹 내 대답을 느끼게 더 나은 당신에 대해 투표되고 있는지만,나는 그것이 특히 재미없을 요구할 때 왜 무언가가 선정이 되었고 아무도 답변.

에 대한 더 큰 진수 문자열은 다음과 같 예에서 나는 사용하는 데 필요한 strtoul.

진수를 구분해서 사용하는 경우가 있습니다그것을 실행하지 않는 온라인에서 컴파일러기 때문에,그것은 작동하지 않습니다.

#include<stdio.h>
void main()
{
    unsigned int i;
    scanf("%x",&i);
    printf("%d",i);
}

이유 코드를 작동 하는 솔루션 계까?확실히,그것은 추한 ...

아마도 때문 뿐만 아니라 못생긴 그렇지 않은 교육 작동합니다.또한,내가 심는 나 같은,대부분의 사람들 수 있는 능력을 필요가 없을 편집에서 제시(그리고 판단에 의해 순위 필요하지 않습니다).

를 사용할 수 있다는 것을 알게 됩니다 좋은 효율성에 대한,하지만 이번에 언급된 코드입니다.그것은 또한 계정 없음의 상단 및 하단 케이스로 작동하지 않습에 대한 예에 제공된 질문입니다.FFFFFFFE

@에릭

이제 희망 보 C 마법사를 포스트 무언가가 정말 멋진,같은 종류의 무엇을 했는지 하지만하게 표시되는 동안,아직도 그 일을"수동".

라면 나에게는 아무런 도움도 안되 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;
}

나는 원래가 더 있었 bitmasking 가에서 대신의 비교를 중 bitmasking 은 어떤보다 빠르게 비교에 현대적인 하드웨어입니다.

이로 변환하수 Hex

    #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;
}
#include "math.h"
#include "stdio.h"
///////////////////////////////////////////////////////////////
//  The bits arg represents the bit say:8,16,32...                                                                                                              
/////////////////////////////////////////////////////////////
volatile long Hex_To_Int(long Hex,char bits)
{
    long Hex_2_Int;
    char byte;
    Hex_2_Int=0;

    for(byte=0;byte<bits;byte++)
    {
        if(Hex&(0x0001<<byte))
            Hex_2_Int+=1*(pow(2,byte));
        else
            Hex_2_Int+=0*(pow(2,byte));
    }

    return Hex_2_Int;
}
///////////////////////////////////////////////////////////////
//                                                                                                                  
/////////////////////////////////////////////////////////////

void main (void)
{
    int Dec;   
    char Hex=0xFA;
    Dec= Hex_To_Int(Hex,8);  //convert an 8-bis hexadecimal value to a number in base 10
    printf("the number is %d",Dec);
}

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;
}

이것은 현재와 낮은 경우 그러나 그것의 최고 쉬운 사용하여 작동하도록 모두.

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";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top