奇怪的十六进制到十进制转换

时间:2017-11-02 02:35:38

标签: c math hex decimal

有人以奇怪的(错误的)格式传递数据。要解析它我需要:

0x34 = 34

NOT 0x34 = 52(就像在现实生活中一样)

所以,基本上只是扯掉十六进制并假装它一直是十进制的。

任何帮助?

编辑:为了更容易,我需要这样的东西:

int i = 52被传递给一个返回int为34的函数

int i = 85产生的int为55

双重编辑:有些东西倒退了。我今晚挣扎哈哈。

2 个答案:

答案 0 :(得分:4)

这是一个适用于unsigned int的解决方案:

unsigned int convert(unsigned int n)
{
    unsigned int r;
    unsigned int m;

    r = 0;
    m = 1;
    while (n) {
        r += m * (n & 0xf);
        n >>= 4;
        m *= 10;
    }

    return r;
}

这是反函数:

unsigned int iconvert(unsigned int n)
{
    unsigned int r;
    unsigned int s;

    r = 0;
    s = 0;
    while (n) {
        r += (n % 10) << s;
        n /= 10;
        s += 4;
    }

    return r;
}

所以convert(34) = 52iconvert(52) = 34

答案 1 :(得分:0)

这就是你需要的吗?

char * strip_hex_prefix( char *str)
{
    if( str && ( strlen(str) > 2 )  && (strncmp(tolower(str),"0x",2) == 0) )
       return str+2;
}

或只是直接在代码中

if( str && ( strlen(str) > 2 )  && (strncmp(tolower(str),"0x",2) == 0) )
   str += 2;

并进一步转换为小数

int hex_2_dec(char *str)
{   
    int len = strlen(str);
    int base = 1;
    int dec_val = 0;

    for (int i=len-1; i>=0; i--)
    {   
        if (str[i]>='0' && str[i]<='9')
        {
            dec_val += (str[i] - 48)*base;
            base = base * 16;
        }
        else if (str[i]>='A' && str[i]<='F')
        {
            dec_val += (str[i] - 55)*base;
            base = base*16;
        }
    }
    return dec_val;
}