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)

      注意:结构体成员变量要定义的类型(是否存的下)。

posted @ 2023-06-16 17:56  耿通宇  阅读(21)  评论(0编辑  收藏  举报