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