在做嵌入式软件的设计中,常常会遇到十六进制、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. return rslt;
  48. }
  49. /////////////////////////////////////////////////////////
  50. //
  51. //功能:十进制转十六进制
  52. //
  53. //输入:int dec                     待转换的十进制数据
  54. //      int length                  转换后的十六进制数据长度
  55. //
  56. //输出:unsigned char *hex          转换后的十六进制数据
  57. //
  58. //返回:0    success
  59. //
  60. //思路:原理同十六进制转十进制
  61. //////////////////////////////////////////////////////////
  62. int DectoHex(int dec, unsigned char *hex, int length)
  63. {
  64. int i;
  65. for(i=length-1; i>=0; i--)
  66. {
  67. hex[i] = (dec%256)&0xFF;
  68. dec /= 256;
  69. }
  70. return 0;
  71. }
  72. /////////////////////////////////////////////////////////
  73. //
  74. //功能:求权
  75. //
  76. //输入:int base                    进制基数
  77. //      int times                   权级数
  78. //
  79. //输出:
  80. //
  81. //返回:unsigned long               当前数据位的权
  82. //
  83. //////////////////////////////////////////////////////////
  84. unsigned long power(int base, int times)
  85. {
  86. int i;
  87. unsigned long rslt = 1;
  88. for(i=0; i<times; i++)
  89. rslt *= base;
  90. return rslt;
  91. }
  92. /////////////////////////////////////////////////////////
  93. //
  94. //功能:BCD转10进制
  95. //
  96. //输入:const unsigned char *bcd     待转换的BCD码
  97. //      int length                   BCD码数据长度
  98. //
  99. //输出:
  100. //
  101. //返回:unsigned long               当前数据位的权
  102. //
  103. //思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100
  104. //      先求每一个字符所表示的十进制值,然后乘以权
  105. //////////////////////////////////////////////////////////
  106. unsigned long  BCDtoDec(const unsigned char *bcd, int length)
  107. {
  108. int i, tmp;
  109. unsigned long dec = 0;
  110. for(i=0; i<length; i++)
  111. {
  112. tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);
  113. dec += tmp * power(100, length-1-i);
  114. }
  115. return dec;
  116. }
  117. /////////////////////////////////////////////////////////
  118. //
  119. //功能:十进制转BCD码
  120. //
  121. //输入:int Dec                      待转换的十进制数据
  122. //      int length                   BCD码数据长度
  123. //
  124. //输出:unsigned char *Bcd           转换后的BCD码
  125. //
  126. //返回:0  success
  127. //
  128. //思路:原理同BCD码转十进制
  129. //
  130. //////////////////////////////////////////////////////////
  131. int DectoBCD(int Dec, unsigned char *Bcd, int length)
  132. {
  133. int i;
  134. int temp;
  135. for(i=length-1; i>=0; i--)
  136. {
  137. temp = Dec%100;
  138. Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
  139. Dec /= 100;
  140. }
  141. return 0;
  142. }
  143. int main()
  144. {
  145. register int i;
  146. unsigned char tmp_bff[12] = "";
  147. //十六进制转十进制
  148. unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};
  149. unsigned long dec_hex = 0;
  150. dec_hex = HextoDec(HEX, 4);
  151. printf("dec_hex = %d/n", dec_hex);
  152. //十进制转十六进制
  153. DectoHex(dec_hex, tmp_bff, 4);
  154. for(i=0; i<5; i++)
  155. {
  156. printf("tmp_bff[%d] = 0x%02X/n",i, tmp_bff[i]);
  157. }
  158. //BCD码转十进制
  159. unsigned long dec_bcd = 0;
  160. unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
  161. dec_bcd = BCDtoDec(BCD, 4);
  162. printf("dec_bcd = %d/n", dec_bcd);
  163. //十进制转BCD码
  164. DectoBCD(dec_bcd, tmp_bff, 4);
  165. for(i=0; i<5; i++)
  166. {
  167. printf("tmp_bff[%d] = 0x%02X/n", i, tmp_bff[i]);
  168. }
  169. getchar();
  170. }

假设有其它的方法能够一起讨论

BCD码、十六进制与十进制互转的更多相关文章

  1. C# 进制转换(二进制、十六进制、十进制互转)

    原文地址:https://www.cnblogs.com/icebutterfly/p/8884023.html C# 进制转换(二进制.十六进制.十进制互转)由于二进制数在C#中无法直接表示,所以所 ...

  2. C# 进制转换(二进制、十六进制、十进制互转) 转载 https://www.cnblogs.com/icebutterfly/p/8884023.html

    C# 进制转换(二进制.十六进制.十进制互转)由于二进制数在C#中无法直接表示,所以所有二进制数都用一个字符串来表示例如: 二进制: 1010 表示为 字符串:"1010" int ...

  3. [No000071]C# 进制转换(二进制、十六进制、十进制互转)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 汇编_压缩BCD码和非压缩BCD码

    BCD码是表示十进制数的,非压缩BCD码是用8位表示的,其实只用低4位,高4位全为0. 例如,十进制数36,用非压缩BCD码表示为:0000 0011 0000 0110 ,这是两个字节. 压缩BCD ...

  5. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码

    这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...

  6. BCD码与16进制互转算法

    关于这类算法,以前的文章已经讲过类似的:BCD码转二进制 #include <stdio.h> // HEX转BCD //bcd_data(<0x255,>0) unsigne ...

  7. BCD码转十进制C语言实现

    #include <stdio.h> #include <stdlib.h> #define uchar unsigned char uchar BCD_Decimal(uch ...

  8. 二进制 转换成十进制 BCD码(加3移位法)

    "原来的二进制数十几位,则左移时就要左移几位" "二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位 ...

  9. BCD码转换为十进制或者十进制转为BCD码

    BCD码其实就是之前在数字电路中说的 用4位二进制数值 来表示一个0-9中的数字,例如: 0000=0 0001=1 0010=2 0011=3也就是说如果把一个数字作为一个BCD码,例如: 11 2 ...

随机推荐

  1. 在iOS上present一个半透明的viewController

    UIViewController *viewController = [[UIViewController alloc]init]; UIViewController* controller = se ...

  2. 修改UISearchBar输入框字体颜色

    UITextField *searchField = [mySearchBar valueForKey:@"_searchField"]; searchField.textColo ...

  3. java匿名内部类,多态,接口练习

    1多态以及接口调用方法: public class Interface { public static void main(String[] args) { Al x = new Al(); jian ...

  4. [HTML5] Level up -- Display

    HTML5 Input type: Traditionally presentational tags, the i, b, em, and strong tags have been given n ...

  5. IoC容器Autofac之实例引入(一)

    先不必尝试理解IOC,先来看段代码. 一.一个没有使用IoC的例子 public class MPGMovieLister { public Movie[] GetMPG() { var finder ...

  6. Android 定义重名权限问题

    一直以来对android的权限机制就有一个疑问,因为在使用权限时,实际上只需要permission的name这一个标签,而在定义权限时,android是不会检查是否重名的,那么在两个应用定义了重名权限 ...

  7. mysql Fatal error encountered during command execution

    由于在操作中使用了自定义参数. 所以得在连接字符串中加上Allow User Variables=True: 表示允许用户自定义参数.

  8. JavaScript数组知识网络

    JavaScript数据类型 基本数据类型 Boolean Null Number String Symbol Undefined 对象数据类型Object Build-in object Array ...

  9. (转) launch failed.Binary not found in Linux/Ubuntu解决方案

    原地址: http://blog.csdn.net/abcjennifer/article/details/7573916 Linux下出现launch failed.Binary not found ...

  10. .c_str()/atoi()/

    1. c_str是把string类型强制转换为const string 2. atpi(): Convert string to integer --Parses the C-string str i ...