一行代码说清楚进制转换

一行代码如下:

int comm_bcd_to_bin(unsigned char bcd)
{
	return (bcd>>4)*10 + (bcd&0x0F);
}

可以测试下:

#include<stdio.h>

int main()
{
	char data=0x78;
	printf("%d\n",data );//120
	data=comm_bcd_to_bin(data);
	printf("%d\n",data );//78
}    

思路就是:暴力把数据分成两部分,一部分是高4位 A,一部分是低4位 B。

此后的事情就是 :

你要16进制的 我就给你A*16 +B   此时数据依旧客观正确

你要10进制的 我就给你A*10 +B   此时数据变化了0X78其实是120,数据转换后变成78

用以前的风格写一下:(不要在意函数的名字)

#include<stdio.h>

#define GetHBits(val_8)     ((val_8>>4)&0x0F)
#define GetLBits(val_8)     (val_8     &0x0F)

#define HEX2BCD(HEX)        ( GetHBits(HEX)*10 + GetLBits(HEX) )

int main()
{
	short data=0x12;
	printf("%d\n",data );//18
	printf("%d\n",HEX2BCD(data) );//12
} 

现在就是十六进制的0X12变成十进制的12,如果你希望十六进制变十六进制就定义为:

 #define HEX2BCD(HEX)        ( GetHBits(HEX)*16 + GetLBits(HEX) )

再看看u16的 :----其实完全没有意义了 u8才是绝配的0X12这样的数据就是u8的8个位置4个一捏4个一捏的。

#include<stdio.h>

#define GetHBits(val_8)     ((val_8>>8)&0xFF)
#define GetLBits(val_8)     (val_8     &0xFF)

#define HEX2BCD(HEX)        ( GetHBits(HEX)*16*16 + GetLBits(HEX) )

int main()
{
	short data=0x1234;
	printf("%d\n",data );//4660
	printf("%d\n",HEX2BCD(data) );//4660
}    
   

1此时十六进制转十六进制。用法上是没有意义的,我们是希望十进制转化成十六进制才有意义。

2#define HEX2BCD(HEX)     (GetHBits(HEX)<<8 | GetLBits(HEX))  可以!

3#define HEX2BCD(HEX)     (GetHBits(HEX)*10*10 | GetLBits(HEX))  不可以!

再看一个u8的二分的例子,按键开门,点击确认#以后的函数:

《充电桩用的记录密码的是arr[6]其实用arr[3]就可以了 因为你都是1 2 3 4 5 6 7 8 9 0呀所以你是0X01 0X02这样你可以挤一挤》

uint8_t *userPwd , *pairPwd;
uint8_t pwd[3];//6位的密码 用arr[3]即可
     
log(DEBUG,"校验固定密码\n");

pwd[0] = touchKey.buffer[0]<<4|touchKey.buffer[1];
pwd[1] = touchKey.buffer[2]<<4|touchKey.buffer[3];
pwd[2] = touchKey.buffer[4]<<4|touchKey.buffer[5];
config.read(CFG_PAIR_PWD , (void **)&pairPwd );
config.read(CFG_USER_PWD , (void **)&userPwd );

if((aiot_strcmp(pwd , pairPwd , 3) == TRUE )||(aiot_strcmp(pwd , userPwd , 3) == TRUE ))
{
   open_door();
..




/* 
 *  设备默认配对密码
 */
-DDEFAULT_PAIR_PWD="{0X12,0x34,0x56}"


/* 
 *  设备默认开门密码
 */
-DDEFAULT_OPEN_PWD="{0X12,0x34,0x56}"

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/81117892