1

コードで概説されている方法で4桁の16進数を含む文字列hex_txtが与えられ、2つの配列エントリに分割されます。10進数に変換する必要があります。以下は私がそれをしている方法です。

unsigned char hex_txt[] = "\xAB\xCD";
unsigned char hex_num[5];
unsigned int dec_num;

sprintf(hex_num, "%.2x%.2x", (int)hex_txt[0], (int)hex_txt[1]);
printf("%s\n", hex_num);
sscanf(hex_num, "%x", &dec_num);
printf("%d\n", dec_num);

これを行うためのより速い、またはより効率的な方法はありますか?これは私の現在のアドホックソリューションですが、それを行う適切な方法があるかどうかを知りたいです。

4

5 に答える 5

5
int result = (unsigned char)hex_txt[0] * 256 + (unsigned char)hex_txt[1];

文字列hex_txtには 2 バイトが含まれます。順序はビッグエンディアンだと思います(リトルエンディアンの場合は添え字を逆にしてください)。の文字コードhex_txt[0]は 0xAB、hex_txt[1]は 0xCD です。unsigned char キャストを使用すると、署名された文字によって混乱することがなくなります。

または、すべてを一度に実行するには:

printf("%d\n", (unsigned char)hex_txt[0] * 256 + (unsigned char)hex_txt[1]);
于 2009-09-08T14:04:36.727 に答える
1

strtoul()の関数を使用するだけstdlib.hです。
次の例を参照してください。

const char sHex[] = "AE";

unsigned char ucByte = 0;

ucByte = (unsigned char) strtoul(sHex, NULL, 16); //BASE 16 FOR HEX VALUES
于 2013-06-04T07:01:40.013 に答える
0

これが私がすることです:

n = 0;
while (*p){
    if (ISDIGIT(*p)) n = n*16 + (*p++ - '0');
    else if (ISALPHA(*p)) n = n*16 + (LOWERCASE(*p++) - 'a' + 10);
    else break;
}

そして(あなたはこれを嫌うでしょうが、それはASCIIで動作します)私はチートします:

#define LOWERCASE(c) ((c) | ' ')

追加: 申し訳ありませんが、あなたの質問を読み直しました。しない理由:

(unsigned int)(unsigned char)p[0] * 256 + (unsigned int)(unsigned char)p[1]
于 2009-09-08T14:01:55.953 に答える
0

ここで公開した C++ コードの一部がありますが、必要ないかもしれません。

于 2009-09-09T05:37:41.540 に答える
0

せせらぎかもしれませんが、使用する場合:

 char hex_txt[] = "\xAB\xCD";

実際には、2 バイトを定義するだけです。

 char hex_txt[] = {0xab, 0xcd};

これを int に変換するには、次のようにします。

 int number = (int) ((short *) *hex_text);
于 2009-09-08T14:05:18.920 に答える