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

    #include <stdio.h>

     #include <string.h>

  1. /*******************************************************************
  2. *功能:二进制取反
  3. *输入:const unsigned char *src  二进制数据
  4. *      int length                待转换的二进制数据长度
  5. *
  6. *输出:unsigned char *dst        取反后的二进制数据
  7. *
  8. *返回:0    success
  9. *
  10. ********************************************************************/
  11. int convert(unsigned char *dst, const unsigned char *src, int length)
  12. {
  13.         int i;
  14.         for(i=0; i<length; i++)
  15.         {
  16.                 dst[i] = src[i]^0xFF;
  17.         }
  18.         return 0;
  19. }
  20. /*************************************************************************
  21. *功能:十六进制转为十进制
  22. *
  23. *输入:const unsigned char *hex         待转换的十六进制数据
  24. *      int length                       十六进制数据长度
  25. *输出:
  26. *
  27. *返回:int  rslt                        转换后的十进制数据
  28. *
  29. *思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256
  30. *      左移8位(<<8)等价乘以256
  31. *
  32. **************************************************************************/
  33. unsigned long HextoDec(const unsigned char *hex, int length)
  34. {
  35.     int i;
  36.     unsigned long rslt = 0;
  37.     for(i=0; i<length; i++)
  38.     {
  39.         rslt += (unsignedlong)(hex[i])<<(8*(length-1-i));
  40.                                                         
  41.     }
  42.     return rslt;
  43. }
  44. /*********************************************************************
  45. *功能:十进制转十六进制
  46. *
  47. *输入:int dec                     待转换的十进制数据
  48. *     int length                  转换后的十六进制数据长度
  49. *
  50. *输出:unsigned char *hex          转换后的十六进制数据
  51. *
  52. *返回:0    success
  53. *
  54. *思路:原理同十六进制转十进制
  55. ***********************************************************************/
  56. int DectoHex(int dec, unsigned char *hex, int length)
  57. {
  58.     int i;
  59.     for(i=length-1; i>=0; i--)
  60.     {
  61.         hex[i] = (dec%256)&0xFF;
  62.         dec /= 256;
  63.     }
  64.     return 0;
  65. }
  66. /************************************************************************
  67. *
  68. *功能:求权
  69. *
  70. *输入:int base                    进制基数
  71. *     int times                   权级数
  72. *
  73. *输出:
  74. *
  75. *返回:unsigned long               当前数据位的权
  76. *
  77. *************************************************************************/
  78. unsigned long power(int base, int times)
  79. {
  80.     int i;
  81.     unsigned long rslt = 1;
  82.     for(i=0; i<times; i++)
  83.         rslt *= base;
  84.     return rslt;
  85. }
  86. /************************************************************************
  87. *
  88. *功能:BCD转10进制
  89. *
  90. *输入:const unsigned char *bcd     待转换的BCD码
  91. *     int length                   BCD码数据长度
  92. *
  93. *输出:
  94. *
  95. *返回:unsigned long               当前数据位的权
  96. *
  97. *思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100
  98. *      先求每个字符所表示的十进制值,然后乘以权
  99. ************************************************************************/
  100. unsigned long  BCDtoDec(const unsigned char *bcd, int length)
  101. {
  102.      int i, tmp;
  103.      unsigned long dec = 0;
  104.      for(i=0; i<length; i++)
  105.      {
  106.         tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);   
  107.         dec += tmp * power(100, length-1-i);          
  108.      }
  109.      return dec;
  110. }
  111. /******************************************************************************
  112. *
  113. *功能:十进制转BCD码
  114. *
  115. *输入:int Dec                      待转换的十进制数据
  116. *      int length                   BCD码数据长度
  117. *
  118. *输出:unsigned char *Bcd           转换后的BCD码
  119. *
  120. *返回:0  success
  121. *
  122. *思路:原理同BCD码转十进制
  123. *
  124. ********************************************************************************/
  125. int DectoBCD(int Dec, unsigned char *Bcd, int length)
  126. {
  127.      int i;
  128.      int temp;
  129.      for(i=length-1; i>=0; i--)
  130.      {
  131.          temp = Dec%100;
  132.          Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
  133.          Dec /= 100;
  134.      }
  135.      return 0;
  136. }
  137. int main()
  138. {
  139.     register int i;
  140.     unsigned char tmp_bff[12] = "";
  141.     //十六进制转十进制
  142.     unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};
  143.     unsigned long dec_hex = 0;
  144.     dec_hex = HextoDec(HEX, 4);
  145.     
  146.     printf("dec_hex = %d/n", dec_hex);
  147.     //十进制转十六进制
  148.     DectoHex(dec_hex, tmp_bff, 4);
  149.     for(i=0; i<5; i++)
  150.     {
  151.         printf("tmp_bff[%d] = 0x%02X/n",i, tmp_bff[i]);
  152.     }
  153.     //BCD码转十进制
  154.     unsigned long dec_bcd = 0;
  155.     unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
  156.     dec_bcd = BCDtoDec(BCD, 4);
  157.     printf("dec_bcd = %d/n", dec_bcd);
  158.     //十进制转BCD码
  159.     DectoBCD(dec_bcd, tmp_bff, 4);
  160.     for(i=0; i<5; i++)
  161.     {
  162.         printf("tmp_bff[%d] = 0x%02X/n", i, tmp_bff[i]);
  163.     }
  164.     getchar();
  165. }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值