字符串转整形 整形转字符串 等一系列转换

/***********************
*函数功能:整形转字符串
*输入参数:
            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码
    }
}

 

posted @ 2020-03-20 19:13  祁峰_1024  阅读(401)  评论(0编辑  收藏  举报