1

我得到了一个字符串 hex_txt,其中包含一个 4 位十六进制数字,按照代码中概述的方式,分成两个数组条目。我需要将其转换为十进制。以下是我的做法。

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包含两个字节;我猜这个顺序是big-endian(如果是little-endian,则反转下标)。字符代码为hex_txt[0]0xAB,forhex_txt[1]为 0xCD。使用无符号字符转换可确保您不会被有符号字符弄乱。

或者,一次完成所有操作:

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

我可能会喋喋不休,但如果你使用:

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

那么实际上你只定义了 2 个字节:

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

因此要将其转换为 int,您可以执行以下操作:

 int number = (int) ((short *) *hex_text);
于 2009-09-08T14:05:18.920 回答
0

您可能不需要它,尽管我在此处发布了一段 C++ 代码。

于 2009-09-09T05:37:41.540 回答