/***********************
*函数功能:整形转字符串
*输入参数:
indata 输入整形
outdata 输出字符串
radix 进制 十进制则填 10
*返回值 :输出字符串
************************/
char *int_to_char(int indata,char outdata[],int radix)
{
char temp[33];
char *tp = temp;
int i;
unsigned v;
int sign;
char *sp;
if(radix > 36 || radix < 1)
return 0;
sign = (radix == 10 && indata < 0); //十进制负数
if(sign)
v = -indata;
else
v = (unsigned)indata;
while(v || tp == temp) //转化操作
{
i = v % radix;
v = v / radix;
if(i < 10)
*tp++ = i + '0';
else
*tp++ = i + 'a' - 10;
}
if(outdata == 0)
outdata = (char*)malloc((tp - temp) + sign + 1);
sp = outdata;
if(sign) //是负数的话把负号先加入数组
*sp++ = '-';
while(tp > temp)
*sp++ = *--tp;
*sp = 0;
return outdata;
}
/***********************
*函数功能:字符串转转整形
*输入参数:
indata 输入字符串
*返回值 :输出的整形数
************************/
int char_to_int(char indata[])
{
char *str = indata;
int result;
//保存返回结果的
int signal = 1;
//保存符号的,默认正数
//判断第一个数字是否合法
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+')
{
//如果是-,符号变为-1,指针右移
//如果是+,指针右移(总之指向了第一个数字)
if(*str=='-'||*str=='+')
{
if(*str=='-')
signal = -1;
str++;
}
}
else
{
return 0;//第一个不是+,-或数字,非法返回0
}
//这里就是转换,是数学的问题就不解释了
while(*str>='0'&&*str<='9')
{
result = result*10+(*str++ -'0');
}
return signal*result;
}
/***********************
*函数功能:16进制转换为bcd
*输入参数:
indata 输入16进制
*返回值 :输出16进制
************************/
unsigned char Hex_to_Bcd(unsigned char indata)
{
unsigned char temp1,temp2;
temp1 = indata/10;
temp2 = indata%10;
return ((temp1<<4)+temp2);
}
/***********************
*函数功能:bcd转为16进制
*输入参数:
indata 输入bcd码
*返回值 :输出16进制
************************/
unsigned char Bcd_to_Hex(unsigned char indata)
{
return ((indata>>4)*10+(indata&0x0f));
}
/***********************
*函数功能:bcd转为ascii
*输入参数:
bcd 输入bcd
ascii 输出ascii
len Bcd码字节个数
*返回值 :
************************/
void bcd_to_asc(unsigned char *ascii,unsigned char *bcd,int Len)
{
int i;
for(i=0;i<Len;i++)
{
//高Nibble转换
if(((*(bcd + i) & 0xF0) >> 4) <= 9)
{
*(ascii + 2*i) = ((*(bcd + i) & 0xF0) >> 4) + 0x30;
}
else
{
*(ascii + 2*i) = ((*(bcd + i) & 0xF0) >> 4) + 0x37; //大写A~F
}
//低Nibble转换
if((*(bcd + i) & 0x0F) <= 9)
{
*(ascii + 2*i + 1) = (*(bcd + i) & 0x0F) + 0x30;
}
else
{
*(ascii + 2*i + 1) = (*(bcd + i) & 0x0F) + 0x37; //大写A~F
}
}
}
/***********************
*函数功能:ascii转为bcd
*输入参数:
bcd 输出bcd
ascii 输入ascii
len ascii码字节个数
*返回值 :
************************/
void ascii_to_bcd(unsigned char *bcd,unsigned char *ascii,int Len)
{
int i;
unsigned char high = 0,low = 0;
for(i = 0; i < Len; i++)
{
//待转bcd码高Nibble
if((*(ascii + i) >= 0x61) && (*(ascii + i) <= 0x66)) //range a~f
{
high = *(ascii + i) - 0x57;
}
else if((*(ascii + i) >= 0x41) && (*(ascii + i) <= 0x46)) //range A~F
{
high = *(ascii + i) - 0x37;
}
else if((*(ascii + i) >= 0x30) && (*(ascii + i) <= 0x39)) //range 0~9
{
high = *(ascii + i) - 0x30;
}
else
{
high = 0x00 ; //其他
}
//待转bcd码低Nibble
i++;
if(i < Len)
{
if((*(ascii + i) >= 0x61) && (*(ascii + i) <= 0x66)) //range a~f
{
low = *(ascii + i) - 0x57;
}
else if((*(ascii + i) >= 0x41) && (*(ascii + i) <= 0x46)) //range A~F
{
low = *(ascii + i) - 0x37;
}
else if((*(ascii + i) >= 0x30) && (*(ascii + i) <= 0x39)) //range 0~9
{
low = *(ascii + i) - 0x30;
}
else
{
low = 0x00 ; //其他
}
}
else
{
i--; //预防255个时溢出出错
low = 0x00 ;
//如果是奇数个末尾补0x00
}
*(bcd + i/2) = (high << 4) | low; //合并BCD码
}
}