在做嵌入式软件的设计中,常常会遇到十六进制、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. HashMap的使用方法及注意事项

    99.Map(映射):Map 的keySet()方法会返回 key 的集合,因为 Map 的键是不能重复的,因此 keySet()方法的返回类型是 Set:而 Map 的值是可以重复的,因此 valu ...

  2. springMVC3学习(六)--SimpleFormController

    SimpleFormController提交表单流程例如以下: login.jsp <form action="login" method="post"& ...

  3. [Spring入门学习笔记][Spring Boot]

    什么是Spring Boot Spring Boot正是在这样的一个背景下被抽象出来的开发框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架 ...

  4. [HeadFirst-JSPServlet学习笔记][第二章:高层概述]

    第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...

  5. lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)

    lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能)   添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...

  6. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  7. C#实现在线更新系统

    先来看一下程序完成后长什么样. 这个是程序的组成部分. 主要功能是在InitializationUpdate这个类中完成的,From1主要起到调用的作用,所以重心还是在InitializationUp ...

  8. javascript sort排序

    var arr = [5,32,28,66,2,15,3]; arr.sort(function(a1,a2){ return a1-a2; //a2-a1 输入倒序 }); console.log( ...

  9. PHP获取客户端操作系统,浏览器,语言,IP,IP归属地等

    <?php class Client { ////获得访客浏览器类型 function Get_Browser(){ if(!empty($_SERVER['HTTP_USER_AGENT']) ...

  10. 菜单之一:Menu基础内容

    参考<疯狂android讲义>2.10节P168 1.重要接口 Android菜单相关的重要接口共有以下四个: 其中Menu为普通菜单,SubMenu包含子项,ContextMenu当长时 ...