質問

C、その中で最も効率的な方法で変換し文字列の六角レンチ桁の数字をバイナリ unsigned int または unsigned long?

例えば、もしていま 0xFFFFFFFE, たいと思い、 int のbase10値 4294967294.

役に立ちましたか?

解決

したい strtol または strtoul.も参考にしてください Unix manページ

他のヒント

編集: 現在対応MSVC、C++、GNUコンパイラでコンパイルを参照す。

の質問に"できます。" のOPを指定していない、彼が編纂のための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; 
}

必要な外部ライブラリすべきであるblindinglyます。取り扱いは大文字,小文字、無効な文字サイズの六角入力例: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動作しない場合はlenがえ最長の整数32または64bitsありませんエラートラップのための不正六角文字です。

のための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

している場合は、多くの場合、問題に苦しんでおり、深刻な語い的構造エラー/定義しています。共通講演では通常は関係ありませんが、このような特定の問題で重要な役割を担っています。

だがしなければならないと思うか"六角レンチを価値"と"数値"は"六角番号"と"十進数)."六角"と"点"の財産であり 表現 の値です。この間、値又は数字)自分ない表現することが可能ですので、なる"六角"や"decimal"です。例えば、 0xF15 Cの書式は異なる 表現同じ番号.

したものではないでしょうかうかというのは、この変換する必要があASCII表現した値(文字列をASCII数を表現した値を別の文字列).方法が確立されてきていることは整数表現において一:まず、変換ASCII表現の整数を表すのに十分なサイズの機能を利用から 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はより速比較現代のハードウェア

えてしまうことへの変換から小数点を六角レンチ

    #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