16 進文字の 4 バイト文字列があり、それらを c で 2 バイト整数に変換したいと考えています。
strtol、fprintf、または fscanf を使用できません。
これ欲しい:-
unsigned char *hexstring = "12FF";
これに変換するには:-
unsigned int hexInt = 0x12FF
編集:ああ、アズムハクの提案されたリンクを読んでください。これは間違いなくその質問の複製です。「0x」プレフィックスを扱っているため、azmuhakのリンクの回答もより完全です...
以下は、標準ライブラリを使用せずに機能します... こちらの ideone で参照してください
#include <stdio.h>
#define ASCII_0_VALU 48
#define ASCII_9_VALU 57
#define ASCII_A_VALU 65
#define ASCII_F_VALU 70
unsigned int HexStringToUInt(char const* hexstring)
{
unsigned int result = 0;
char const *c = hexstring;
char thisC;
while( (thisC = *c) != NULL )
{
unsigned int add;
thisC = toupper(thisC);
result <<= 4;
if( thisC >= ASCII_0_VALU && thisC <= ASCII_9_VALU )
add = thisC - ASCII_0_VALU;
else if( thisC >= ASCII_A_VALU && thisC <= ASCII_F_VALU)
add = thisC - ASCII_A_VALU + 10;
else
{
printf("Unrecognised hex character \"%c\"\n", thisC);
exit(-1);
}
result += add;
++c;
}
return result;
}
int main(void)
{
printf("\nANSWER(\"12FF\"): %d\n", HexStringToUInt("12FF"));
printf("\nANSWER(\"abcd\"): %d\n", HexStringToUInt("abcd"));
return 0;
}
コードをより効率的にすることができ、toupper
ライブラリ関数を使用していますが、自分で簡単に実装できます...
また、これは「0x」で始まる文字列を解析しません...しかし、関数の先頭に簡単なチェックを追加して、それらの文字を噛み砕くことができます...