十六进制、BCD码和十进制的转换
2016-01-11 14:58
323 查看
在做嵌入式软件的设计中,经常会遇到十六进制、 BCD 码与十进制之间的转换,最近做 M1 卡的应用中,涉及了大量的十六进制、 BCD 码与十进制之间的转换。笔者通过对 BCD 码、十六进制 权的理解,轻松的实现了他们之间的互换。
本文转载自:http://blog.csdn.net/lenyusun/article/details/5350143
#include <stdio.h> #include <string.h> ///////////////////////////////////////////////////// // // 功能:二进制取反 // // 输入: const unsigned char *src 二进制数据 // int length 待转换的二进制数据长度 // // 输出: unsigned char *dst 取反后的二进制数据 // // 返回: 0 success // ////////////////////////////////////////////////////// int convert(unsigned char *dst, const unsigned char *src, int length) { int i; for(i=0; i<length; i++) { dst[i] = src[i]^0xFF; } return 0; } ////////////////////////////////////////////////////////// // // 功能:十六进制转为十进制 // // 输入: const unsigned char *hex 待转换的十六进制数据 // int length 十六进制数据长度 // // 输出: // // 返回: int rslt 转换后的十进制数据 // // 思路:十六进制每个字符位所表示的十进制数的范围是 0 ~255 ,进制为 256 // 左移 8 位 (<<8) 等价乘以 256 // ///////////////////////////////////////////////////////// unsigned long HextoDec(const unsigned char *hex, int length) { int i; unsigned long rslt = 0; for(i=0; i<length; i++) { rslt += (unsigned long)(hex[i])<<(8*(length-1-i)); } return rslt; } ///////////////////////////////////////////////////////// // // 功能:十进制转十六进制 // // 输入: int dec 待转换的十进制数据 // int length 转换后的十六进制数据长度 // // 输出: unsigned char *hex 转换后的十六进制数据 // // 返回: 0 success // // 思路:原理同十六进制转十进制 ////////////////////////////////////////////////////////// int DectoHex(int dec, unsigned char *hex, int length) { int i; for(i=length-1; i>=0; i--) { hex[i] = (dec%256)&0xFF; dec /= 256; } return 0; } ///////////////////////////////////////////////////////// // // 功能:求权 // // 输入: int base 进制基数 // int times 权级数 // // 输出: // // 返回: unsigned long 当前数据位的权 // ////////////////////////////////////////////////////////// unsigned long power(int base, int times) { int i; unsigned long rslt = 1; for(i=0; i<times; i++) rslt *= base; return rslt; } ///////////////////////////////////////////////////////// // // 功能: BCD 转 10 进制 // // 输入: const unsigned char *bcd 待转换的 BCD 码 // int length BCD 码数据长度 // // 输出: // // 返回: unsigned long 当前数据位的权 // // 思路:压缩 BCD 码一个字符所表示的十进制数据范围为 0 ~ 99, 进制为 100 // 先求每个字符所表示的十进制值,然后乘以权 ////////////////////////////////////////////////////////// unsigned long BCDtoDec(const unsigned char *bcd, int length) { int i, tmp; unsigned long dec = 0; for(i=0; i<length; i++) { tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F); dec += tmp * power(100, length-1-i); } return dec; } ///////////////////////////////////////////////////////// // // 功能:十进制转 BCD 码 // // 输入: int Dec 待转换的十进制数据 // int length BCD 码数据长度 // // 输出: unsigned char *Bcd 转换后的 BCD 码 // // 返回: 0 success // // 思路:原理同 BCD 码转十进制 // ////////////////////////////////////////////////////////// int DectoBCD(int Dec, unsigned char *Bcd, int length) { int i; int temp; for(i=length-1; i>=0; i--) { temp = Dec%100; Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F); Dec /= 100; } return 0; } //------------- 函数信息 ------------------------------------------ // 函 数 名 : BCDtoDec // 函数描述 : BCD 码转换成十进制码 // 入口参数 : temp: 转化的 BCD 码 // 返 回 : 转化后的十进制码 // 作 者 : // 日 期 : 2006.11.24 // 说 明 : // //--------------------------------------------------------------- uint8 BCDtoDec( uint8 temp ) { return ( ( temp/16 )*10+temp%16) ; } //------------- 函数信息 ------------------------------------------ // 函 数 名 : DectoBCD // 函数描述 : 十 / 十六进制码转换成 BCD 码 // 入口参数 : temp: 转化的十进制码 // 返 回 : 转化后的 BCD 码 // 作 者 : // 日 期 : 2006.11.24 // 说 明 : // //--------------------------------------------------------------- uint8 DectoBCD( uint8 temp ) { return ( (temp/10)*16 + temp%10 ) ; }
本文转载自:http://blog.csdn.net/lenyusun/article/details/5350143
相关文章推荐
- Android ClassLoader机制
- Android使用DrawerLayout创建左右两个抽屉菜单
- Python学习手册 - 08
- 通用C 双循环链表(可直接用于项目)
- windows64位下使用python2遇到找不到usage init_tcl的问题
- java过滤器和监听器详解
- 字符编码相关
- 移动端web开发 chapter 1 – introduction
- debug的快捷键
- OpenStack API and WSGI
- Cannot find or open the PDB file
- SCI写作不得不说的经典替换词
- 中国天气网 天气预报API 国家气象局 根据城市名称抓取城市ID,XML格式、JSON格式、图片代码
- hbase安装启动成功,但是执行命令报错
- RxAndroid 应用(三)(简易天气App之Observable内存泄露)
- UML类图简介
- ubantu无法挂载NTFS
- 【Linux命令】杀死僵尸程序
- 如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
- 避免远程调用中固有的滞后时间问题的最佳方法是进行更少的调用,并让每个调用传递更多的数据。