社区导航

 

搜索
查看: 2387|回复: 12

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

[复制链接]

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

发表于 2018-12-3 08:47 | 显示全部楼层 |阅读模式
本帖最后由 tiankai001 于 2018-12-3 18:19 编辑

此内容由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. }
复制代码



此帖出自编程基础论坛

评分

1

查看全部评分



回复

使用道具 举报

7866

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2018-12-3 10:16 | 显示全部楼层
大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请,给你置顶~~

点评

非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好  详情 回复 发表于 2018-12-3 11:04
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

8283

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-12-3 11:00 | 显示全部楼层
内部编写一个子程序多好,简洁又通用的。

点评

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


回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-12-3 11:04 | 显示全部楼层
辛昕 发表于 2018-12-3 10:16
大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请, ...

非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好

点评

爱你哦  详情 回复 发表于 2018-12-3 16:52

评分

1

查看全部评分



回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-12-3 11:17 | 显示全部楼层
dcexpert 发表于 2018-12-3 11:00
内部编写一个子程序多好,简洁又通用的。

这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的

点评

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


回复

使用道具 举报

8283

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-12-3 13:46 | 显示全部楼层
tiankai001 发表于 2018-12-3 11:17
这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的

函数内部有很多重复的部分,这部分可以在写一个子程序。

点评

是的,这部分程序包含了单字节,2字节,4字节的HEX转BCD,囊括的功能有些多,用的话可以根据情况选用一部分。 你的建议很好,谢谢,我改一下  详情 回复 发表于 2018-12-3 13:57


回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-12-3 13:57 | 显示全部楼层
dcexpert 发表于 2018-12-3 13:46
函数内部有很多重复的部分,这部分可以在写一个子程序。

是的,这部分程序包含了单字节,2字节,4字节的HEX转BCD,囊括的功能有些多,用的话可以根据情况选用一部分。
你的建议很好,谢谢,我改一下


回复

使用道具 举报

7866

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2018-12-3 16:52 | 显示全部楼层
tiankai001 发表于 2018-12-3 11:04
非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好

爱你哦
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7866

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2018-12-3 16:53 | 显示全部楼层
精华不需要高技术,只要用心说人话

——让我们一起来做颜值派,从发帖开始
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2018-12-3 18:02 | 显示全部楼层
辛昕 发表于 2018-12-3 16:53
精华不需要高技术,只要用心说人话

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



回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-12-24 16:25 | 显示全部楼层
mark


回复

使用道具 举报

7866

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2019-3-19 00:58 | 显示全部楼层
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?

当然,纯属老毛病追求通用犯了。
我誓死捍卫分开写的权利。

点评

这个完全可以做到, 我还有个long long型HEX转BCD的,用的移位算法,回头贴出来。然后根据你的建议整合一下  详情 回复 发表于 2019-3-19 08:58
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7492

TA的帖子

4948

TA的资源

版主

Rank: 6Rank: 6

资源大师勋章

 楼主| 发表于 2019-3-19 08:58 | 显示全部楼层
辛昕 发表于 2019-3-19 00:58
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?
...

这个完全可以做到,
我还有个long long型HEX转BCD的,用的移位算法,回头贴出来。然后根据你的建议整合一下


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-24 07:05 , Processed in 0.366022 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表