在一次工程中,遇到了一个奇怪的格式转换

是这样的,定义了一个时间,格式为BCD,7个字节。
长这样:

0x20 0x20 0x11 0x24 0x17 0x15 0x20

然后呢,国标上规则了一个东西,里面也有时间,格式为HEX。
长这样:

0x7E4 0xB 0x18 0x11 0xF 0x14

这时,就需要把前面的时间格式转换成后面的时间格式。
我这里想到了两种思路:

1.BCD -> SRTINGS --> DEC

相当于前面的时间就是十六进制,先把十六进制转成字符串,再转成十进制就可以了,单片机内存储的是十六进制,输出十进制就是国标上的格式了。

2.将每一位取出,再转成十六进制

我这里就把第一种贴出来

/* 十六进制转字符串 */
void HexToStr(uint8_t *pszDest, uint8_t *pbSrc, uint8_t nLen)
{
	uint8_t	ddl, ddh;
	for (uint8_t i = 0; i < nLen; i++)
	{
		ddh = 48 + pbSrc[i] / 16;
		ddl = 48 + pbSrc[i] % 16;
		if (ddh > 57) ddh = ddh + 7;
		if (ddl > 57) ddl = ddl + 7;
		pszDest[i * 2] = ddh;
		pszDest[i * 2 + 1] = ddl;
	}
 
	pszDest[nLen * 2] = '\0';
}
/* 字符串转十进制 */
void StrtoDec(uint8_t *pbDest, uint8_t *pbSrc, uint8_t nLen)
{
	uint8_t i;
	uint8_t nTempDest[5],nTempData[2];
	uint16_t nTemp;

	for (i = 0; i < nLen/2-3; i++)
	{ 
		nTempDest[i] = (pbSrc[4+2*i] -'0') * 10 + (pbSrc[4+2*i+1] -'0');
//		DBG_PRINTF("%d = %d *10 - %d\n",nTempDest[i],(pbSrc[4+2*i] -'0') * 10 ,(pbSrc[4+2*i+1] -'0'));
	} 
	
	nTemp = (pbSrc[0] -'0') * 1000 + (pbSrc[1] -'0') * 100 + (pbSrc[2] -'0') * 10 + (pbSrc[3] -'0');
	memcpy(nTempData,(uint8_t *)&nTemp,2);
	pbDest[0] = nTempData[1];
	pbDest[1] = nTempData[0];	
	
	memcpy(pbDest+2,nTempDest,nLen/2-3);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江邺英

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

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

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

打赏作者

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

抵扣说明:

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

余额充值