BCD码、十六进制与十进制互转

在做嵌入式软件的设计中,经常会遇到十六进制、BCD码与十进制之间的转换,最近做M1卡的应用中,涉及了大量的十六进制、BCD码与十进制之间的转换。笔者通过对BCD码、十六进制 权的理解,轻松的实现了他们之间的互换。
#include  
#include
///////////////////////////////////////////////////// 
// 
//功能:二进制取反 
// 
//输入:const unsigned char *src  二进制数据 
//      int length                待转换的二进制数据长度 
// 
//输出:unsigned char *dst        取反后的二进制数据 
// 
//返回:0    success 
// 
////////////////////////////////////////////////////// 
int convert(unsigned char *dst, const unsigned char *src, int length) 

        int i;
        for(i=0; i
        { 
                dst[i] = src[i]^0xFF; 
        } 
        return 0; 
}
////////////////////////////////////////////////////////// 
// 
//功能:十六进制转为十进制 
// 
//输入:const unsigned char *hex         待转换的十六进制数据 
//      int length                       十六进制数据长度 
// 
//输出: 
// 
//返回:int  rslt                        转换后的十进制数据 
// 
//思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256 
//      左移8位(<<8)等价乘以256 
// 
///////////////////////////////////////////////////////// 
unsigned long HextoDec(const unsigned char *hex, int length) 

    int i; 
    unsigned long rslt = 0;
    for(i=0; i
    { 
        rslt += (unsigned long)(hex[i])<<(8*(length-1-i)); 
                                                         
    }
    return rslt; 
}


///////////////////////////////////////////////////////// 
// 
//功能:十进制转十六进制 
// 
//输入:int dec                     待转换的十进制数据 
//      int length                  转换后的十六进制数据长度 
// 
//输出:unsigned char *hex          转换后的十六进制数据 
// 
//返回:0    success 
// 
//思路:原理同十六进制转十进制 
////////////////////////////////////////////////////////// 
int DectoHex(int dec, unsigned char *hex, int length) 

    int i;
    for(i=length-1; i>=0; i--) 
    { 
        hex[i] = (dec%6)&0xFF; 
        dec /= 256; 
    }
    return 0; 
}
///////////////////////////////////////////////////////// 
// 
//功能:求权 
// 
//输入:int base                    进制基数 
//      int times                   权级数 
// 
//输出: 
// 
//返回:unsigned long               当前数据位的权 
// 
////////////////////////////////////////////////////////// 
unsigned long power(int base, int times) 

    int i; 
    unsigned long rslt = 1;
    for(i=0; i
        rslt *= base;
    return rslt; 
}
///////////////////////////////////////////////////////// 
// 
//功能:BCD转10进制 
// 
//输入:const unsigned char *bcd     待转换的BCD码 
//      int length                   BCD码数据长度 
// 
//输出: 
// 
//返回:unsigned long               当前数据位的权 
// 
//思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100 
//      先求每个字符所表示的十进制值,然后乘以权 
////////////////////////////////////////////////////////// 
unsigned long  BCDtoDec(const unsigned char *bcd, int length) 

     int i, tmp; 
     unsigned long dec = 0;
     for(i=0; i
     { 
        tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);    
        dec += tmp * power(100, length-1-i);           
     }
     return dec; 
}
///////////////////////////////////////////////////////// 
// 
//功能:十进制转BCD码 
// 
//输入:int Dec                      待转换的十进制数据 
//      int length                   BCD码数据长度 
// 
//输出:unsigned char *Bcd           转换后的BCD码 
// 
//返回:0  success 
// 
//思路:原理同BCD码转十进制 
// 
////////////////////////////////////////////////////////// 
int DectoBCD(int Dec, unsigned char *Bcd, int length) 

     int i; 
     int temp;
     for(i=length-1; i>=0; i--) 
     { 
         temp = Dec0; 
         Bcd[i] = ((temp/10)<<4) + ((temp) & 0x0F); 
         Dec /= 100; 
     }
     return 0; 
}
int main() 

    register int i; 
    unsigned char tmp_bff[12] = "";
    //十六进制转十进制 
    unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF}; 
    unsigned long dec_hex = 0;
    dec_hex = HextoDec(HEX, 4); 
     
    printf("dec_hex = %d\n", dec_hex);
    //十进制转十六进制 
    DectoHex(dec_hex, tmp_bff, 4); 
    for(i=0; i<5; i++) 
    { 
        printf("tmp_bff[%d] = 0xX\n",i, tmp_bff[i]); 
    }
    //BCD码转十进制 
    unsigned long dec_bcd = 0; 
    unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
    dec_bcd = BCDtoDec(BCD, 4); 
    printf("dec_bcd = %d\n", dec_bcd);
    //十进制转BCD码 
    DectoBCD(dec_bcd, tmp_bff, 4); 
    for(i=0; i<5; i++) 
    { 
        printf("tmp_bff[%d] = 0xX\n", i, tmp_bff[i]); 
    }
    getchar(); 
}


BCD
 


 


void BCDToChar(const unsigned char *src,unsigned int srcLen, unsigned char *dest)
{
    unsigned char temp[2] = {0};
    unsigned char temp2[1] = {0};
    for(int i=0; i
    {
       temp2[0] = src[i];


       temp[0] = src[i]>>4;
       temp[0] = temp[0]&0x0F;
       temp[0] = temp[0]+0x30;


       temp[1] = temp2[0]&0x0F;
       temp[1] = temp[1]+0x30;


       dest[i*2] = temp[0];
       dest[i*2+1] = temp[1];
    }
}

你可能感兴趣的:(BCD码、十六进制与十进制互转)