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

C 奇怪的十六进制到十进制转换,c,math,hex,decimal,C,Math,Hex,Decimal,有人以奇怪(错误)的格式向我传递数据。要分析它,我需要: 0x34=34 不是0x34=52(就像现实生活中那样) 所以,基本上就是撕下十六进制,假装它一直都是十进制的 有什么帮助吗 编辑:为了让它更容易,我需要这样的东西: int i=52被传递到一个返回int值34的函数中 int i=85表示int为55 双重编辑:有一些东西倒过来了。今晚我很挣扎哈哈。这就是你需要的吗 char * strip_hex_prefix( char *str) { if( str &&

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

0x34=34

不是0x34=52(就像现实生活中那样)

所以,基本上就是撕下十六进制,假装它一直都是十进制的

有什么帮助吗

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

int i=52被传递到一个返回int值34的函数中

int i=85表示int为55


双重编辑:有一些东西倒过来了。今晚我很挣扎哈哈。

这就是你需要的吗

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;
}
int十六进制2十二进制(char*str)
{   
int len=strlen(str);
int base=1;
int dec_val=0;
对于(int i=len-1;i>=0;i--)
{   

如果(str[i]>='0'&&str[i]='A'&&str[i]这就是你需要的吗

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;
}
int十六进制2十二进制(char*str)
{   
int len=strlen(str);
int base=1;
int dec_val=0;
对于(int i=len-1;i>=0;i--)
{   

如果(str[i]>='0'&&str[i]='A'&&str[i],这里有一个可用于无符号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;
}
unsigned int i转换(unsigned int n)
{
无符号整数r;
无符号整数s;
r=0;
s=0;
while(n){

r+=(n%10)下面是一个适用于无符号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;
}
unsigned int i转换(unsigned int n)
{
无符号整数r;
无符号整数s;
r=0;
s=0;
while(n){


r+=(n%10)函数的字符串参数,或从文件中读取?您尝试了什么?可以使用适当的
scanf()来完成
格式,例如
“0x%d”
可以完成这项工作……只需删除前两个字符?它保存在可转换为int的字符*中。蓝牙低能量通信。很抱歉没有澄清。因此,基本上您获取的是BCD格式的数据,并尝试将其转换为正常的二进制整数。这并不奇怪,但实际上是这在过去很常用,在许多应用程序中仍然广泛使用。函数的字符串参数或从文件读取?您尝试过什么?可以使用适当的
scanf()来完成
格式,例如
“0x%d”
可以完成这项工作……只需删除前两个字符?它保存在可转换为int的字符*中。蓝牙低能量通信。很抱歉没有澄清。因此,基本上您获取的是BCD格式的数据,并尝试将其转换为正常的二进制整数。这并不奇怪,但实际上是lly这在过去很常用,但在许多应用程序中仍然广泛使用。可能就是这样。你能用我所做的编辑进行验证吗?我解释得不好。@user2985888
convert(0x34)
,即
convert(52)
产生了
34
。这是你想要的吗?还是你想要这个的倒数?原始帖子暗示了这一点,但编辑暗示了倒数。我也可以添加倒数,给我一分钟。我又编辑了一次。这看起来是对的。谢谢你!好的,我添加了正数和倒数两个版本-你挑吧!我只是有一个crap night lol。我会接受的。我验证了它的工作原理。我的编辑很差。可能就是这样。你能用我所做的编辑进行验证吗?我解释得很差。@user2985888
convert(0x34)
,即
convert(52)
产生了
34
。这是你想要的吗?还是你想要这个的倒数?原始帖子暗示了这一点,但编辑暗示了倒数。我也可以添加倒数,给我一分钟。我又编辑了一次。这看起来是对的。谢谢你!好的,我添加了正数和倒数两个版本-你挑吧!我只是有一个cra晚上笑。我会接受这个。我验证了它的工作。我的编辑只是差。