在做嵌入式软件的设计中,常常会遇到十六进制、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获取一个方法的执行时间

    #import <Foundation/Foundation.h> #import <mach/mach_time.h> typedef void (^block)(void) ...

  2. Coreseek:常见的问题2

    1.failed to lock XXXXX.spl档 这是当你构建的指数将是一个问题,您不必打开searchd服务关闭,既然你开searchd维修,他将建立呼叫xxx.spl临时文件,施工时的指数会 ...

  3. EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)

    1.属性可以进行数据绑定 2.可以做数据安全校验.在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决 如下代码不可取 public string Name { get { if(thi ...

  4. jQuery validate 的valid()方法一直返回true

    1 调用$('#myForm').valid(),一直返回ture eg:html <form id="myForm"> <input class="f ...

  5. HTML5-常见的事件- beforeunload事件

    当我们在日常访问某些网站时,关闭当前网页时出现如下提示: beforeunload 事件就可以完成这样的事情,该事件发生时机:页面卸载之前,可以通过它来取消卸载并继续使用原有页面. 为了显示上面弹出对 ...

  6. html进阶css(5)

    css定位机制 css有三种基本的定位机制:普通流,浮动和绝对定位. 除非专门指定,否则所有框都在普通流中定位.也就是说,普通流中的元素的位置由元素在html中的位置决定. 块级框从上到下一个接一个的 ...

  7. 更新Android SDK 出错 Failed to rename directory \temp\ToolPackage.old01

    打算更新Android SDK 版本到 Android SDK Tools 20,打开SDK Manager.exe 开始更新,结果安装时弹出错误提示:Failed to rename directo ...

  8. Ext树控件第一次勾选父节点子节点没选中

    项目中同事提出了这样一个bug 问题: 第一次勾选父节点子节点竟然没选中,逆天了啊 初步分析: 可能是之前代码的逻辑错误造成的,随进入调试阶段... 调试中发现该参数为空(原来写代码的也太没素质了), ...

  9. MyBatis调用Oracle的存储过程

    Mapper.xml文件: --------------------------------- <parameterMap type="map" id="class ...

  10. stl学习之模板

    模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数. C++提供两种模板:函数模板,类模板.   template<typename T> //或者 templa ...