BCD格式及与十进制/十六进制的转换

前言

本系列Autosar 诊断入门介绍,会详细介绍诊断相关基础知识,如您对诊断实战有更高需求,可参见诊断实战系列专栏,快速链接:Autosar诊断实战系列导读
如您MCAL配置,通信,诊断,OS等Autosar全栈实战有更高需求,可以参见AutoSar 实战进阶系列专栏,快速链接:AutoSar实战进阶系列导读

在诊断快照开发中会遇到保存年月日等使用BCD码格式的需求,本篇我们就一起看一下BCD码是什么?十进制与BCD码如何互换?十六进制与BCD码如何互换?在这里会直接封装成可以使用的接口供大家直接在项目中调用,方便你我他。

1. BCD码是什么?

BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码使用四个位Bit来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
举个栗子,对于十进制的19,对应BCD码格式就是0001 1001,即前四个Bit合起来为1,后一个Bit合起来为9,这样的表达形式对于日期,时间等表达上较为直观。

另外,对于BCD码也可细分成下面的8421码,5421码,2421码及余3码等,8421码,5421码,2421码为有权BCD码,但加权方式不一样,比如对于8421码,四个Bit对应的值分别为8,4,2,1。8421BCD码也是使用较多的BCD编码格式,下面我们讲到的格式互换也是以8421BCD码进行,后续提到的BCD码默认是8421BCD码。
在这里插入图片描述

2. 不同进制与BCD码之间的转换

本章节我们会说明不同进制与BCD码之间的转换,计算方法+接口封装,从学到用相结合。

2.1 十进制与BCD码的转换

在十进制转换到BCD码时,核心思想即是将个位数放在低四Bit,十位数放在顺序往前的四Bit,如果有百位,千位以此类推,涉及到位移操作。

2.1.1 十进制转换为BCD码

int Func_DecToBcd(int decimal)
{
	int sum = 0;  //sum为BCD码
 	for (int i = 0; decimal > 0; i++)
	{
		sum |= ((decimal % 10 ) << ( 4*i));
 		decimal /= 10; 
	}
 	return sum;
}

2.1.2 BCD码转换为十进制

int Func_BcdToDec( int bcd)
{
	int sum = 0; // sum为十进制
	int c = 1;  //c乘法因子,每次翻10倍
 	for(int i = 1; bcd > 0; i++)
	{
		if( i >= 2)
		{
			c*=10;
		}
 		sum += (bcd%16) * c;
 		bcd /= 16;  // 右移四位
	}

2.2 十六进制与BCD码的转换

注意这里的0x15,在本示例代码中需要先将其转换成十进制,即对应十进制21,再转换为BCD码,代码待进一步完善。

最后附一张换算图:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Autosar汽车电子进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值