文字として格納されている 16 進値があります。
char A = '0';
char B = '6';
char C = 'E';
...整数に変換する必要があります。「atoi」は知っていますが、これは 10 進コード化された char 値に対してのみ機能します。同様の機能はありますか?
int v = (A > '9')? (A &~ 0x20) - 'A' + 10: (A - '0');
ASCII では正しいです。他の文字セットの場合、同様のアプローチが機能しますが、toupper
代わりに&~ 0x20
.
あなたは試すことができstrtol
ます。しかしstrtol
、 0 が必要なchar *
ので、次のように終了します:
long x = strtol((char[]){A, 0}, NULL, 16);
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);
ベース16を使用したいことを明示的に述べることができますstrtol
char C = 'E';
int num = strtol (&C ,NULL,16); // 14
null で終了する配列C
ではないことに注意してください。文字を次のように変更できれば簡単に解決できます。
char C[] = "E";
int num = strtol(C, NULL, 16);
明らかな解決策は、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 ) ];
#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;
}