将存储为chars的十六进制字符串转换为C中的十进制

时间:2009-09-08 13:55:09

标签: c decimal hex scanf

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

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);

有更快,更有效的方法吗?这是我目前的临时解决方案,但我想知道是否有正确的方法。

5 个答案:

答案 0 :(得分:5)

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

字符串hex_txt包含两个字节;我猜这个命令是big-endian(如果它是little-endian则反转下标)。 hex_txt[0]的字符代码为0xAB,hex_txt[1]的字符代码为0xCD。使用unsigned char强制转换可确保您不会被签名字符弄乱。

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

printf("%d\n", (unsigned char)hex_txt[0] * 256 + (unsigned char)hex_txt[1]);

答案 1 :(得分:1)

只需使用strtoul()中的stdlib.h功能即可 请参阅以下示例:

const char sHex[] = "AE";

unsigned char ucByte = 0;

ucByte = (unsigned char) strtoul(sHex, NULL, 16); //BASE 16 FOR HEX VALUES

答案 2 :(得分: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]

答案 3 :(得分:0)

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

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

然后实际上你只定义了2个字节:

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

所以要将它转换为int,你可以这样做:

 int number = (int) ((short *) *hex_text);

答案 4 :(得分:0)

你可能不需要它,虽然我发布了一段C ++代码here