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

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

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