方法一:
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);
}
方法二:
#include <stdio.h>
#define YES 1
#define NO 0
int htoi(char s[])
{ //0x3ABC
int hexdigit, i, inhex, n;
//判断前面是否有0x
i = 0;
if (s[i] == '0')
{
i++;
if (s[i] == 'x' || s[i] == 'X')
i++;
}
//转成十进制
inhex = YES;
n = 0;
for (; inhex == YES; ++i)
{
if (s[i] >= '0' && s[i] <= '9')
{
hexdigit = s[i] - '0';
}
else if (s[i] >= 'a' && s[i] <= 'f')
{
hexdigit = s[i] - 'a' + 10;
}
else if (s[i] >= 'A' && s[i] <= 'F')
{
hexdigit = s[i] - 'A' + 10;
}
else
{
inhex = NO;
}
if (inhex == YES)
{
n = 16 * n + hexdigit;
}
}
return n;
}
int main()
{
char s[] = "0x16aC7";
int ret = htoi(s);
printf("%d", ret);
}