C语言中常用位操作
一、移位操作
数据如下:
unsigned char card_data[] = {0x09, 0xF0, 0x30, 0x56, 0xD0, 0xE9, 0x95, 0x46};
unsigned int card=0,QrEndtime=0;
unsigned char timebuff[20]={0};
1、假设用前4字节(09、F0、30、56)作为卡号如何获取到这个卡号呢?
card = (card_data[0]<<24)+(card_data[1]<<16)+(card_data[2]<<8)+(card_data[3]<<0);
简单移位:数据:buff[0] = 0x22; buff[1] = 0x6b; 要合并成 0x6b22
unsigned short = (buff[1] << 8) + buff[0]; (要加括号)
2、假设用后4字节(D0、E9、95、46)作为时间如何获取到这个时间呢?获取格式如下表:
(1)、首先拿到这四个字节完整数据:
QrEndtime = (timebuff[0]<<24)+(timebuff[1]<<16)+(timebuff[2]<<8)+(timebuff[3]<<0);
此时QrEndtime变量里就存了3504969059,即:D0E99563
(2)、如果需要将改数据(D0E99563)用如下表中格式解析时间怎么获取?
假设有如下结构体来存储:
Time.year =(QrEndtime&0x3F);
Time.month = (QrEndtime>>6)&0x0F;
Time.day = (QrEndtime>>10)&0x1F;
Time.hour = (QrEndtime>>15)&0x1F;
Time.minute = (QrEndtime>>20)&0x3F;
Time.second = (QrEndtime>>26)&0x3F;
sprintf(timebuff,"%d-%02d-%02d %02d:%02d:%02d",Time.year,Time.month,Time.day,Time.hour,Time.minute,Time.second);
timebuff: 23-05-05 19:14:52 (0x0E=14 , 0x34=52)
注意:结构体成员变量要定义的类型(是否存的下)。