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

本文框架

  • 前言
  • 1. BCD码是什么?
  • 2. 不同进制与BCD码之间的转换
    • 2.1 十进制与BCD码的转换
      • 2.1.1 十进制转换为BCD码
      • 2.1.2 BCD码转换为十进制
    • 2.2 十六进制与BCD码的转换

前言

在诊断快照开发中会遇到保存年月日等使用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码。
BCD格式及与十进制/十六进制的转换_第1张图片

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码,代码待进一步完善。

最后附一张换算图:
BCD格式及与十进制/十六进制的转换_第2张图片

你可能感兴趣的:(#,Autosar,Diag,Stack系列,Autosar扫盲系列,autosar,BCD,UDS)