字符串形式的十六进制转换为其对应的十进制数字。

2019-07-21 05:09发布

本帖最后由 zuozhongkai 于 2017-10-20 12:41 编辑

遇到有客户问道这个问题,这是个典型的字符串处理问题,为什么要单独将这个问题列出出来,因为字符串转数字是非常常见的,很多C语言基础不扎实的开发者就会束手无策!我花了点时间做了一下,一共三个函数:
int charhex_to_dec(char *chr)    //此函数是可以直接调用的API函数,参数chr就是要转换的字符串,返回值就是将字符串转换完成的int形数值,比如字符串”0x16“转换出来就是十进制的22。
u8 chrtodec(char chr)               //此函数用来将单个的字符转换为其所对应的十进制数值,比如字符”A“或者”a“的十进制就是10,此函数要考虑处理大小写的问题。
int cal16match(u8 n)                //此函数用来计算16的n次方,也即是n个16相乘,n为次方数或者16相乘的个数,为什么是16呢?因为是十六进制!!!!!
函数charhex_to_dec()会调用chrtodec()和cal16match()


总共只需这三个函数即可完成题目的功能,程序不长,加上注释基本就60行,只是测试的示例代码,代码如下:
[mw_shl_code=applescript,true]//将字符'0' ~ 'D'转换为相应的数字
//返回值:字符转换完成一会对应的数值
u8 chrtodec(char chr)
{
        u8 value=0;
        
        //先全部将小写转换为大写
        if((chr>='a')&&(chr<='z'))
                chr=chr-32;
        
        //将字符转化成相应的数字
        if((chr>='0')&&(chr<='9'))
                value=chr-48;
        else if((chr>='A')&&(chr<='Z'))
                value=chr-65+10;
        
        return value;
}

//计算n个16相乘
//n:16相称的次数
//返回值:计算出来的结果
int cal16match(u8 n)
{
        u8 i=0;
        int value=1;
        
        for(i=0;i<n;i++)
                value*=16;

        return value;
}

//将字符串格式的十六进制转换为数字型,
//如字符串“0x16”转换为int型的22。
//参数 chr: 要转换的字符串,不区分大小写!!!!
//返回值:参数chr转换完成以后的十进制数值
int charhex_to_dec(char *chr)
{
        u8 i,chrlen;
        u8 sta=0; //标记要转换的字符串是否以0x,或者0X开头
        int chrtoint=0;
        int value=0;
        
        chrlen=strlen(chr);
        
        //检查字符串是否是以0x或者0X开头的。
        if((chr[0] == '0') && ((chr[1]=='x') || (chr[1] == 'X')))
        {
                sta=2;        //标记以0x,0X开头
                chrlen=chrlen-2;
        }

        //计算
        for(i=0;i<chrlen;i++)
        {
                chrtoint=chrtodec(chr[sta+i]);
                if(i!=(chrlen-1))                //不是最后一位
                        value+=chrtoint*cal16match(chrlen-1-i);
                else if(i==(chrlen-1))         //最后一位
                        value+=chrtoint;
                                
        }
        return value;
}[/mw_shl_code]


程序设计思路

1、提取有用的信息。
     字符串”0x16“里面我们用来在后面参与计算的、真正有效的字符只有”16“,所以要去掉”0x“,"0X",当然了如果你要转换的字符串直接就是”16“的话那就不需要处理了。处理过程在函数charhex_to_dec()里面,处理代码如下:
     [mw_shl_code=applescript,true]//检查字符串是否是以0x或者0X开头的。
        if((chr[0] == '0') && ((chr[1]=='x') || (chr[1] == 'X')))
        {
                sta=2;        //标记以0x,0X开头
                chrlen=chrlen-2;
        }[/mw_shl_code]

2、将单个字符转换为其对应的数值
     字符”16“怎么转换为十进制的22呢?计算公式很简单,就是:1*16 + 6 =22,如果是”0x1f“的话就是:1*16 + f=1*16+15=31。由此可见,要想转换字符串,首先要先将字符串中的每个字符所代表的数值要先计算出来,并且还要考虑到字符:a~f和A~F,还有字符的大小写问题。
这个功能怎么完成呢?ASCII码啊!!!为了计算方便,首先统一将字母转换为大写,这一步也是不区分大小写功能的实现。最后计算字符所对应的数值,字符”0“在ASCII码表上的数值是48,但是它所代表的数值就要减去这个48,即‘0’-48=48-48=0,同理‘0’~‘9’和‘A’~‘Z’都可以这样计算,
此功能是由函数chrtodec()完成的,处理过程如下:
[mw_shl_code=applescript,true]u8 chrtodec(char chr)
{
        u8 value=0;
        
        //先全部将小写转换为大写
        if((chr>='a')&&(chr<='z'))
                chr=chr-32;
        
        //将字符转化成相应的数字
        if((chr>='0')&&(chr<='9'))
                value=chr-48;
        else if((chr>='A')&&(chr<='Z'))
                value=chr-65+10;
        
        return value;
}[/mw_shl_code]

3、拼接!
    我们已经将字符串中的单个字符所对应的数值计算出来了,最后就是将其”拼接“在一起,计算出最终的数值。同样以”0x16“为例,此字符串参与计算的字符只有”16“,即字符长度strlen=2,那么”16“=1*(16^(strlen-1)) + 6*(16^(strlen-2))=1*(16^1) + 6*(16^0)=22。由此可见,需要一个计算16的n次方的函数,也就是
n个16相乘的函数,此函数就是cal16match(),非常简单的一个函数。
[mw_shl_code=applescript,true]int cal16match(u8 n)
{
        u8 i=0;
        int value=1;
        
        for(i=0;i<n;i++)
                value*=16;

        return value;
}[/mw_shl_code]
最后的计算就是由函数charhex_to_dec()中后面的代码来完成了,如下:
[mw_shl_code=applescript,true]        //计算
        for(i=0;i<chrlen;i++)
        {
                chrtoint=chrtodec(chr[sta+i]);
                if(i!=(chrlen-1))                //不是最后一位
                        value+=chrtoint*cal16match(chrlen-1-i);
                else if(i==(chrlen-1))         //最后一位
                        value+=chrtoint;
                                
        }[/mw_shl_code]

4、测试:
    完成以后即可进行一下测试,看一下函数工作是否正常,我的测试如下图所示:
N2]W%MIBHG~3)0Y}FIFEANL.png

结论:
   实际工作中对于字符串的各种处理是非常常见的,本贴讲的还是一个很小的问题,建议那些C语言基础不扎实的同学一定要多做练习,熟练掌握C语言的各种字符串处理。最后附件附上测试代码。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
taizonglai
1楼-- · 2019-07-22 01:47
秋天 发表于 2018-11-5 17:53
谢谢分享,原来你就是视频里的人

对的,是我
castle
2楼-- · 2019-07-22 03:50
 精彩回答 2  元偷偷看……
萌新007
3楼-- · 2019-07-22 06:27
感谢楼主分享

一周热门 更多>