• 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. }

    假设有其它的方法能够一起讨论
  • 相关阅读:
    windows系统历年高危漏洞
    安全产品分类
    防火墙
    UTM(统一威胁管理)
    ORA-39127: 调用 "WMSYS"."LT_EXPORT_PKG"."SCHEMA_INFO_EXP" 时发生意外错误
    oracle如何查看当前有哪些用户连接到数据库
    LINUX修改主机名
    删除Oracle用户及表空间
    Oracle AWR报告详细分析--比较详细
    RMAN优缺点及RMAN备份及恢复步骤
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3792236.html
Copyright © 2020-2023  润新知