我按照代码中列出的方式给出了一个包含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);
有更快,更有效的方法吗?这是我目前的临时解决方案,但我想知道是否有正确的方法。
答案 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。