十进制、十六进制、bcd互转

来源:互联网 发布:手机做广告软件 编辑:程序博客网 时间:2024/06/08 13:45
//输出: 
// 
//返回: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];
    }
}
原创粉丝点击