使用C语言将5位标准故障码转换为16进制格式

DTC(Diagnostic Trouble Code)表示诊断故障码,通常客户传递的诊断调查表中,只有如下图所示的5位标准故障码(DTCHighByte+DTCMiddleByte)和Symptom ID(DTCLowByte)。

那么,软件开发时,又需要将“U100888”转换为16进制的"D00088",如何转换呢?去网上搜了一下,找到了如何将标准故障码转换为16进制的规范,详情请参考:汽车DTC故障码格式解析_RichardsZ_的博客-CSDN博客

如何使用C在线实现呢,简单写了下,代码如下,有问题欢迎讨论指正!

#include<stdio.h>
typedef unsigned char u8;
int main()
{
  char DTC1[]="B16EC11";	
  u8  byte2=0x00;
  u8  byte1=0x00;
  u8  byte0=0x00;
	
if(DTC1[0]== 'P')
{
	byte2=0x00;
}
else if(DTC1[0]=='C')
{
	byte2|=(1<<6);		
}
else if(DTC1[0]=='B')
{
	byte2|=(1<<7);		
}
else if(DTC1[0]=='U')
{
                byte2|=(1<<6);
	byte2|=(1<<7);		
}
//判断第二位
switch(DTC1[1]-48)
{
	case 0:
		byte2=0x00;
	break;
	case 1:
	    byte2|=(1<<4);
	break;
	case 2:
		byte2|=(1<<5);
	break;
	case 3:
		byte2|=(1<<4);
		byte2|=(1<<5);
	break;
	default:
	printf("您输入的数据有误!");
}

//********判断字符是数字还是字母************
	int B2,B3,B4,B5,B6;
for(int j=1;j++,j<7;)
{
	if((48<=DTC1[j])&&(DTC1[j]<=57))
	{
       switch(j)
	  {
		 case 2:B2=48;break;
		 case 3:B3=48;break;
		 case 4:B4=48;break;	 
		 case 5:B5=48;break;
		 case 6:B6=48;break;
	  }
	}
	else if((65<=DTC1[j])&&(DTC1[j]<=90))
	{
	    switch(j)
	  {
		 case 2:B2=55;break;//'A'=65
		 case 3:B3=55;break;
		 case 4:B4=55;break;	 
		 case 5:B5=55;break;
		 case 6:B6=55;break;
	   }
	}
}	
//*************第三位*********************
	byte2+=(DTC1[2]-B2);

	//printf("DTCHighByte=%#x\n",byte2);
//************第四第五位******************		
	byte1+=(DTC1[3]-B3)<<4;//移位优先级最低
	byte1+=(DTC1[4]-B4);

	//printf("DTCMiddleByte=%#x\n",byte1);
//************DTClowByte*****************
	byte0+=(DTC1[5]-B5)<<4;
	byte0+=(DTC1[6]-B6);

	//printf("DTCLowByte=%#X\n",byte0);//%#x带#表示带“0x”
/*%X 不输出前导零。改用 %02X;2表示至少输出2位数字,0表示'0'填充左侧的输出字符,如果输出少于 2 位。*/
	printf("DTC_%02X%02X%02X\n",byte2,byte1,byte0);//X表示大写x表示小写
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值