用法
- 1 参数:参数类型为char, 十六进制字符串形式:0X××××××[NUT],十进制字符串形式:×××××××[NUT],字符串的最大长度为16,字符串结尾符必须为ascii码值0(NUT)。
- 2 返回值:返回值类型为unsigned int
原理
以传入的参数str的前两个字符判断str是表示十进制还是十六进制,然后依据数制判断后面的字符是否合法,如果不合法直接返回,否则将其复制到buf中,最后依据数制计算出数值。
代码
unsigned int str2uint(char *str)
{
/* max 32bit integer is 4294967296, buf[16] is enough */
char buf[16];
int i;
int num;
int base = 10;
int ret_val;
if (NULL == str)
return 0;
i = 0;
while (i<16) {
/* Format it */
if ((str[i] == 'X') || (str[i] == 'x')) {
buf[i] = 'x';
if (i != 1)
return 0; /* not 0[x]XXXXXXXX */
else if (buf[0] != '0')
return 0; /* not [0]xXXXXXXXX */
else
base = 16;
} else if ((str[i] >= '0') && (str[i] <= '9'))
buf[i] = str[i];
else if ((str[i] >= 'a') && (str[i] <= 'f')) {
if (base != 16)
return 0;
buf[i] = str[i];
} else if ((str[i] >= 'A') && (str[i] <= 'F')) {
if (base != 16)
return 0;
buf[i] = str[i] - 'A' + 'a';
} else if (str[i] == 0) {
buf[i] = 0;
i++;
break;
} else
return 0;
i++;
}
num = i-1;
ret_val = 0;
if (base == 10) {
for (i=0; i<num; i++)
ret_val = ret_val*10 + buf[i] - '0';
} else if (base == 16) {
for (i=2; i<num; i++) {
if (buf[i] >= 'a')
ret_val = ret_val*16 + buf[i] - 'a' + 10;
else
ret_val = ret_val*16 + buf[i] - '0';
}
}
return ret_val;
}