在做嵌入式软件的设计中,常常会遇到十六进制、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. SpringMVC(三)——其他知识

    这篇博客,看一下在Controller类中,进行结果的跳转方式,对于SpringMVC框架中异常,如何统一捕捉,还有就是S(SpringMVC)SH的整合. 一,框架默认情况下是通过转发进行跳转的,如 ...

  2. web前端 - 模态对话框

    代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  3. (转)25个增强iOS应用程序性能的提示和技巧--高级篇

    高级当且仅当下面这些技巧能够解决问题的时候,才使用它们: 22.加速启动时间23.使用Autorelease Pool24.缓存图片 — 或者不缓存25.尽量避免Date格式化 高级性能提升 寻找一些 ...

  4. 玩转Nodejs日志管理log4js(转)

    转自:http://blog.fens.me/nodejs-log4js/ 前言 日志对任何的应用来说都是至关重要的.在Nodejs中使用express框架并没有自带的日志模块,我们可以选择log4j ...

  5. HTML中将背景颜色渐变

    通过使用 css3 渐变可以让背景两个或多个指定的颜色之间显示平稳的过渡,由于用到css3所以需要考虑下浏览器兼容问题,例如:从左到右的线性渐变,且带有透明度的样式:#grad {background ...

  6. html5 拖放---(二)转

    draggable是一个枚举属性,用于指定一个标签是否可以被拖拽.有以下四种取值: true 表示此元素可拖拽 false 表示此元素不可拖拽 auto 除img和带href的标签a标签表示可拖拽外, ...

  7. struts 学习之问一

    今天在进行struts全局类型和局部类型转换时,发现一个问题,如下: 当输入一个点的坐标时,我使用全局转换提示错误,找不到类,当改变成局部类型转换时,可以成功转换,不知道这个是什么原因,难道全局不可以 ...

  8. gulp压缩js

    1.安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 2.查看nodejs的版本号 3.npm ...

  9. base64自定义编码表 php版本

    在一次接口对接中,要用到base64自定义编码表来进行编码和解码,从网上搜索了一下,讲原理的比较多也比较透彻,提供的编码的例子但是没有解码的,以下是自己实现的一个base64自定义字典解码的例子,比较 ...

  10. Ubuntu Codeblocks Installation

    Download and Installation sudo add-apt-repository ppa:damien-moore/codeblocks sudo apt update sudo a ...