本帖最后由 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、测试:
完成以后即可进行一下测试,看一下函数工作是否正常,我的测试如下图所示:
结论:
实际工作中对于字符串的各种处理是非常常见的,本贴讲的还是一个很小的问题,建议那些C语言基础不扎实的同学一定要多做练习,熟练掌握C语言的各种字符串处理。最后附件附上测试代码。
不好意思是我定义错了,问题已经解决了。
一周热门 更多>