1-十六进制是一种基数为16的计数系统,是一种逢16进1的进位制。例如十六进制0x57,写成十进制是 5*16^1+7*16^0=87。第一位乘16的0次方,第二位乘16的1一次方。
2-如果0x57按顺序来转化,不太好转,因为不知道有几位。所以先写一个倒置的函数,改写成75x0。先定义一个int i = 0; 7*16^0;i++;7*16^1; 这样就方便乘的i次方。
代码如下:
#include <stdio.h>
#include<math.h>
//字符串倒置
char* inversion(char* s,int i)
{
char str[] = "0000000000xxxxxx";
int j = 0;
str[i] = '\0';
while (*s)
{
str[i - 1] = *s;
i--;
s++;
}
return str;
}
// 把由十六进制数字组成的字符串(包含可选的前缀0X和0x),转化为与之等价的整数值,字符串中包含的字符可以是0-9,A-F,a-f
int htoi(char* s,int len)
{
char *t = inversion(s,len);//倒置
int num = 0;
int i = 0;
while (*t)
{
if ((*(t) == 'x' || *(t) == 'X') && *(t + 1)=='0')
{
t = t+2;
}
if (*t >= '0' && *t <= '9')
{
num += (*t - '0')*pow(16,i);
t++;
i++;
}
if (*t >= 'a' && *t <= 'f')
{
num += (*t - 87) * pow(16, i);
t++;
i++;
}
if (*t >= 'A' && *t <= 'F')
{
num += (*t - 55) * pow(16, i);
t++;
i++;
}
}
return num;
}
int main()
{
char s[] = "0x16aC7";
int len = sizeof(s) - 1;
int ret = htoi(s,len);
printf("%d", ret);
}