一行代码如下:
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}"