[原创] C语言的十六进制(HEX)转BCD码程序

tiankai001   2018-12-3 08:47 楼主
此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处 十六进制和BCD码之间的相互转换是C语言程序设计以及单片机编程中经常会碰到的事情。 我在日常工作中也碰到了这样的情况,所以就写了两段程序:一个是BCD码转十六进制,另一个是十六进制转BCD码,功能实现后,就随手发了两个帖子到EEWORLD,分享一下,大家一起学习。 本帖实现的是十六进制到BCD码的转换。 我们知道,计算机和单片机中数据的存储都是以二进制数存储的,但是使用过程中为简化起见,一般都以十六进制数(HEX)来表达。而BCD码就是我们一般俗称的8421码(当然,还有2421BCD码,5421BCD码,这两种不常用,本帖中我们指的是8421BCD码)。 因为在计算机或单片机中最常用的是单字节、2字节、4字节的数据,所以本帖中,我们分别做了这三种数据类型的十六进制转BCD码的转换。
另外,根据网友意见,将该程序分开几部分,分别实现单字节、2字节、4字节的hex转BCD码,这样看起来、用起来更方便一些。
特别说明:既然有了HEX转BCD的过程,那也会有BCD转换HEX的逆过程。所以我也搞了这个转换的。另外发了一个帖子,有兴趣的话可以看一下。
单字节,100以内的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //单字节十六进制数转BCD码,并且转换出来的BCD码的最大值为99,超过99就要用两个字节装载BCD码
  7. ucHEXdata[0] = 0x63; //十进制为99
  8. ucBCDdata[0] = (ucHEXdata[0]/10)*0x10 + (ucHEXdata[0]%10);
  9. //ucBCDdata[0]=99;//转换出来的
  10. }
单字节0~255以内的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //单字节十六进制数转BCD码,并且转换出来的BCD码的超过99
  7. ucHEXdata[0] = 0xf5; //十进制为245
  8. ucHEXdata[1] = ucHEXdata[0]/100;
  9. ucHEXdata[2] = ucHEXdata[0]%100;
  10. ucBCDdata[0] = ucHEXdata[1];
  11. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  12. //ucBCDdata[1]=2,ucBCDdata[0]=45
  13. }
2字节的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //2字节十六进制数转BCD码,2字节十六进制数最大值为0xffff=65535,所以转换出来的BCD码需要用3个字节装载
  7. uiHEXdata = 0xfff5; //十进制为65525
  8. ucHEXdata[1] = uiHEXdata%100;
  9. ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
  10. uiHEXdata = uiHEXdata/100;
  11. ucHEXdata[2] = uiHEXdata%100;
  12. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  13. uiHEXdata = uiHEXdata/100;
  14. ucHEXdata[3] = uiHEXdata%100;
  15. ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
  16. //ucBCDdata[2]=6,ucBCDdata[1]=55,ucBCDdata[0]=25
  17. }
4字节的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //4字节十六进制数转BCD码,2字节十六进制数最大值为0xffffffff=4294967295,所以转换出来的BCD码需要用5个字节装载
  7. ulHEXdata = 0xfffffff5; //十进制为4294967285
  8. ucHEXdata[1] = ulHEXdata%100;
  9. ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
  10. ulHEXdata = ulHEXdata/100;
  11. ucHEXdata[2] = ulHEXdata%100;
  12. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  13. ulHEXdata = ulHEXdata/100;
  14. ucHEXdata[3] = ulHEXdata%100;
  15. ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
  16. ulHEXdata = ulHEXdata/100;
  17. ucHEXdata[4] = ulHEXdata%100;
  18. ucBCDdata[3] = (ucHEXdata[4]/10)*0x10 + (ucHEXdata[4]%10);
  19. ulHEXdata = ulHEXdata/100;
  20. ucHEXdata[5] = ulHEXdata%100;
  21. ucBCDdata[4] = (ucHEXdata[5]/10)*0x10 + (ucHEXdata[5]%10);
  22. //ucBCDdata[4]=42,ucBCDdata[3]=94,
  23. //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=85
  24. }
4字节的hex转BCD,优化程序
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //4字节十六进制数转BCD码,可以做成一个循环转换的程序
  7. ulHEXdata = 0xfffffff4; //十进制为42 94 96 72 84
  8. for(int i=0;i<5;i++)
  9. {
  10. ucHEXdata=ulHEXdata%100;
  11. ulHEXdata=ulHEXdata/100;
  12. ucBCDdata=(ucHEXdata/10)*0x10+ucHEXdata%10;
  13. }
  14. //ucBCDdata[4]=42,ucBCDdata[3]=94,
  15. //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=84
  16. }
本帖最后由 tiankai001 于 2018-12-3 18:19 编辑

回复评论 (12)

大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请,给你置顶~~
强者为尊,弱者,死无葬身之地
点赞  2018-12-3 10:16
内部编写一个子程序多好,简洁又通用的。
点赞  2018-12-3 11:00
引用: 辛昕 发表于 2018-12-3 10:16
大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请, ...

非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好
点赞  2018-12-3 11:04
引用: dcexpert 发表于 2018-12-3 11:00
内部编写一个子程序多好,简洁又通用的。

这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的
点赞  2018-12-3 11:17
引用: tiankai001 发表于 2018-12-3 11:17
这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的

函数内部有很多重复的部分,这部分可以在写一个子程序。
点赞  2018-12-3 13:46
引用: dcexpert 发表于 2018-12-3 13:46
函数内部有很多重复的部分,这部分可以在写一个子程序。

是的,这部分程序包含了单字节,2字节,4字节的HEX转BCD,囊括的功能有些多,用的话可以根据情况选用一部分。
你的建议很好,谢谢,我改一下
点赞  2018-12-3 13:57
引用: tiankai001 发表于 2018-12-3 11:04
非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好

爱你哦
强者为尊,弱者,死无葬身之地
点赞  2018-12-3 16:52
精华不需要高技术,只要用心说人话

——让我们一起来做颜值派,从发帖开始
强者为尊,弱者,死无葬身之地
点赞  2018-12-3 16:53
引用: 辛昕 发表于 2018-12-3 16:53
精华不需要高技术,只要用心说人话

——让我们一起来做颜值派,从发帖开始

点赞  2018-12-3 18:02
mark
点赞  2018-12-24 16:25
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?

当然,纯属老毛病追求通用犯了。
我誓死捍卫分开写的权利。
强者为尊,弱者,死无葬身之地
点赞  2019-3-19 00:58
引用: 辛昕 发表于 2019-3-19 00:58
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?
...

这个完全可以做到,
我还有个long long型HEX转BCD的,用的移位算法,回头贴出来。然后根据你的建议整合一下
点赞  2019-3-19 08:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复