在做嵌入式软件的方案中,常常会遇到十六进制、BCD码与十进制之间的改换,近期做M1卡的运用中,触及了很多的十六进制、BCD码与十进制之间的改换。笔者经过对BCD码、十六进制权的了解,轻松的结束了他们之间的沟通。
#includelt;stdio.h
#includelt;string.h
/////////////////////////////////////////////////////
//
//功用:二进制取反
//
//输入:constunsignedchar*src二进制数据
//intlength待改换的二进制数据长度
//
//输出:unsignedchar*dst取反后的二进制数据
1
//
//回来:0success
//
//////////////////////////////////////////////////////
intconvert(unsignedchar*dst,constunsignedchar*src,intlength)
{
inti;
for(i=0;ilt;length;i++)
{
dst[i]=src[i]^0xFF;
}
return0;
}
2
//////////////////////////////////////////////////////////
//
//功用:十六进制转为十进制
//
//输入:constunsignedchar*hex待改换的十六进制数据
//intlength十六进制数据长度
//
//输出:
//
//回来:intrslt改换后的十进制数据
//
//思路:十六进制每个字符位所标明的十进制数的方案是0~255,进制为256
//左移8位(lt;lt;8)等价乘以256
3
//
/////////////////////////////////////////////////////////
unsignedlongHextoDec(constunsignedchar*hex,intlength)
{
inti;
unsignedlongrslt=0;
for(i=0;ilt;length;i++)
{
rslt+=(unsignedlong)(hex[i])lt;lt;(8*(length-1-i));
}
returnrslt;
}
/////////////////////////////////////////////////////////
4
//
//功用:十进制转十六进制
//
//输入:intdec待改换的十进制数据
//intlength改换后的十六进制数据长度
//
//输出:unsignedchar*hex改换后的十六进制数据
//
//回来:0success
//
//思路:原理同十六进制转十进制
//////////////////////////////////////////////////////////
intDectoHex(intdec,unsignedchar*hex,intlength)
5
{
inti;
for(i=length-1;i=0;i--)
{
hex[i]=(dec%256)0xFF;
dec/=256;
}
return0;
}
/////////////////////////////////////////////////////////
//
//功用:求权
//
6
//输入:intbase进制基数
//int;x权级数
//
//输出:
//
//回来:unsignedlong其时数据位的权
//
//////////////////////////////////////////////////////////
unsignedlongpower(intbase,int;x)
{
inti;
unsignedlongrslt=1;
for(i=0;ilt;;x;i++)
7
rslt*=base;
returnrslt;
}
/////////////////////////////////////////////////////////
//
//功用:BCD转10进制
//
//输入:constunsignedchar*bcd待改换的BCD码
//intlengthBCD码数据长度
//
//输出:
//
//回来:unsignedlong其时数据位的权
8
//
//思路:紧缩BCD码一个字符所标明的十进制数据方案为0~99,进制为100
//先求每个字符所标明的十进制值,然后乘以权
//////////////////////////////////////////////////////////
unsignedlongBCDtoDec(constunsignedchar*bcd,intlength)
{
inti,tmp;
unsignedlongdec=0;
for(i=0;ilt;length;i++)
{
tmp=((bcd[i]4)0x0F)*10+(bcd[i]0x0F);
dec+=tmp*power(100,length-1-i);
}
9
returndec;
}
/////////////////////////////////////////////////////////
//
//功用:十进制转BCD码
//
//输入:intDec待改换的十进制数据
//intlengthBCD码数据长度
//
//输出:unsignedchar*Bcd改换后的BCD码
//
//回来:0success
//
10
//思路:原理同BCD码转十进制
//
//////////////////////////////////////////////////////////
intDectoBCD(intDec,unsignedchar*Bcd,intlength)
{
inti;
inttemp;
for(i=length-1;i=0;i--)
{
temp=Dec%100;
Bcd[i]=((temp/10)lt;lt;4)+((temp%10)0x0F);
Dec/=100;
}
11
return0;
}
//-------------函数信息------------------------------------------
//函数名:BCDtoDec
//函数描绘:BCD码改换成十进制码
//进口参数:temp:转化的BCD码
//返回:转化后的十进制码
//说明:
//
//---------------------------------------------------------------
uint8BCDtoDec(uint8temp)
{
return((temp/16)*10+temp%16);
12
}
//-------------函数信息------------------------------------------
//函数名:DectoBCD
//函数描绘:十/十六进制码改换成BCD码
//进口参数:temp:转化的十进制码
//返回:转化后的BCD码
//作者:
//日期:2006.11.24
//说明:
//
//---------------------------------------------------------------
uint8DectoBCD(uint8temp)
{
13
return((temp/10)*16+temp%10);
}
14
因篇幅问题不能全部显示,请点此查看更多更全内容