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

做嵌入式软件的设计中,经常会遇到十六进制、BCD码与十进制之间的转换,最近做M1卡的应用中,涉及了大量的十六进制、BCD码与十进制之间的转换。笔者通过对BCD码、十六进制 权的理解,轻松的实现了他们之间的互换。
#include <stdio.h> 
#include <string.h
>

// 
//功能:二进制取反 
// 
//输入: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<length; 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<length; 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%256)&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<times; 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<length; 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 = Dec%100; 
         Bcd[i] = ((temp/10)<<4) + ((temp%10) & 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] = 0x%02X\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] = 0x%02X\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 < srcLen; 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 ];
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值