3

文字として格納されている 16 進値があります。

char A = '0';
char B = '6';
char C = 'E';

...整数に変換する必要があります。「atoi」は知っていますが、これは 10 進コード化された char 値に対してのみ機能します。同様の機能はありますか?

4

7 に答える 7

7
int v = (A > '9')? (A &~ 0x20) - 'A' + 10: (A - '0');

ASCII では正しいです。他の文字セットの場合、同様のアプローチが機能しますが、toupper代わりに&~ 0x20.

于 2012-08-16T12:13:25.973 に答える
4

あなたは試すことができstrtolます。しかしstrtol、 0 が必要なchar *ので、次のように終了します:

long x = strtol((char[]){A, 0}, NULL, 16);
于 2012-08-16T12:13:38.627 に答える
3

C:

const char chrs[] = "0123456789ABCDEF";

int value = -1; // sentinel
const char *loc = strchr(chrs, ch);
if (loc)
    value = loc - chrs;

または、C++ を使用して:

const std::string chrs("0123456789ABCDEF");
int value = chrs.find(ch);
于 2012-08-16T14:04:41.460 に答える
1

ベース16を使用したいことを明示的に述べることができますstrtol

char C = 'E';
int num = strtol (&C ,NULL,16); // 14

null で終了する配列Cではないことに注意してください。文字を次のように変更できれば簡単に解決できます。

char C[] = "E";
int num = strtol(C, NULL, 16);
于 2012-08-16T12:17:05.130 に答える
0

明らかな解決策は、1 つの文字列を作成し、標準の変換手法を使用することです。

std::istringstream tmp( std::string( 1, A ) );
tmp >> anInt;

ただし、これは少し重く (軽く言えば)、実行時間に関してはおそらくあまり効率的ではありません (私が聞いたことがあれば、ちょっとしたことです)。

シンプルで堅牢なソリューションの 1 つは、テーブル ルックアップです。

static char const digits[] = "0123456789ABCDEF";
int value = std::find(digits, digits + 16, A) - digits;
if (value >= 16) {
    //  A wasn't a hex digit...
}

別の方法 (そしてはるかに高速) は、文字をテーブルへのインデックスとして使用することです。

static signed char const values[] =
{
    -1, -1, -1, -1, -1, -1, -1, -1,     //  0x00-0x07
    //  ...
     0,  1,  2,  3,  4,  5,  6,  7,     //  0x30-0x37
     8,  9, -1, -1, -1, -1, -1, -1,     //  0x38-0x3F
    -1, 10, 11, 12, 13, 14, 15, -1,     //  0x40-0x47
    //  ...
    -1, 10, 11, 12, 13, 14, 15, -1,     //  0x60-0x67
    //  ...
};


int value = values[static_cast<unsigned char>( A )];

これはエンコーディングに大きく依存することに注意してください。エンコーディングの問題を回避するために、実行時に数字のリストから作成することをお勧めします。何かのようなもの:

struct ValueTable
{
    signed char values[256];
    ValueTable()
    {
        std::fill( begin(values), end(values), -1 );
        static char const digits[] = "0123456789ABCDEF";
        for ( int i = 0; i < 16; ++ i ) {
            values[ digits[i] = i;
            values[ tolower( digits[i] ) ] = i;
        }
    }
};
static ValueTable const map;

//   ...
int value = map.values[ static_cast<unsigned char>( A ) ];
于 2012-08-16T12:35:23.500 に答える
0
#include <stdio.h>
#include <stdlib.h>


int xtoi(char c)
{
    int v = -1;
    char w=toupper(c);
    if(w >= 'A' && w <= 'F'){
        v = w - 'A' + 0x0A;
    }else if (w >= '0' && w <= '9'){
        v = w - '0';
    }

    return v;
}

int main(int argc,char **argv)
{
    printf("v:%p\n",argc == 2 ? xtoi(argv[1][0]):-1);
    return 0;
}
于 2012-08-16T12:46:47.940 に答える