导航

str转unsigned int

Posted on 2016-09-24 10:25  Fundyqds  阅读(586)  评论(0)    收藏  举报

用法

  1. 1 参数:参数类型为char, 十六进制字符串形式:0X××××××[NUT],十进制字符串形式:×××××××[NUT],字符串的最大长度为16,字符串结尾符必须为ascii码值0(NUT)。
  2. 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;
}