现有一个嵌入式设备终端传输过来的数据包是一个32位无符号的整型数,这个数据包里面各位含义如下:(位运算)
- 00-07位:表示温度数据
- 08-15位:表示湿度数据
- 16-19位:表示4扇门状态(门的编号0-3)
- 20-23位:表示四盏灯的状态(灯编号0-3)
- 24-31位:预留备用
下面是最近一段时间接受的数据包:
请编写一个程序接收这3个数据包,并解析出对应的数据【温度,湿度,门0-3,灯0-3】(门和灯的状态0-关,1-开)。
我自己的思路:
1.定义掩码
#define Temp_MASK 0xff000000
#define Humi_MASK 0x00ff0000
#define Door_1_MASK 0x00008000
#define Door_2_MASK 0x00004000
#define Door_3_MASK 0x00002000
#define Door_4_MASK 0x00001000
#define Light_1_MASK 0x00000800
#define Light_2_MASK 0x00000400
#define Light_3_MASK 0x00000200
#define Light_4_MASK 0x00000100
#define Spare_MASK 0x000000ff
#include<stdio.h>
int main()
{
return 0;
}
2.因为函数中可能多次用要计算温度湿度等所有我定义两个函数来对数据进行处理
int RESO_32 (unsigned int b,unsigned int c,int i)
{
int d = 0;
d = (b & c)>>i;
return d;
}
void NO_OFF (int a )
{
if(a==1)
printf("OFF\n");
else if(a==0)
printf("NO\n");
}
3.依次进行实现
int main()
{
unsigned int data = 0;
scanf("%x",&data);
//判断温度是多少,并输出
int TEMP = RESO_32(data,Temp_MASK,24);
printf("温度:%d\n",TEMP);
//判断湿度是多少,并输出
int HUMI =RESO_32(data,Humi_MASK,16);
printf("湿度:%d\n",HUMI);
//判断门是否开着
int DOOR1 =RESO_32(data,Door_1_MASK,15);
NO_OFF(DOOR1);
int DOOR2 =RESO_32(data,Door_2_MASK,14);
NO_OFF(DOOR2);
int DOOR3 =RESO_32(data,Door_3_MASK,13);
NO_OFF(DOOR3);
int DOOR4 =RESO_32(data,Door_4_MASK,12);
NO_OFF(DOOR4);
int LIGH1 =RESO_32(data,Light_1_MASK,11);
NO_OFF(LIGH1);
int LIGH2 =RESO_32(data,Light_2_MASK,10);
NO_OFF(LIGH2);
int LIGH3 =RESO_32(data,Light_3_MASK,9);
NO_OFF(LIGH3);
int LIGH4 =RESO_32(data,Light_4_MASK,8);
NO_OFF(LIGH4);
return 0;
}
总代码放在这里,希望大家指点
#include<stdio.h>
#define Temp_MASK 0xff000000
#define Humi_MASK 0x00ff0000
#define Door_1_MASK 0x00008000
#define Door_2_MASK 0x00004000
#define Door_3_MASK 0x00002000
#define Door_4_MASK 0x00001000
#define Light_1_MASK 0x00000800
#define Light_2_MASK 0x00000400
#define Light_3_MASK 0x00000200
#define Light_4_MASK 0x00000100
#define Spare_MASK 0x000000ff
int RESO_32 (unsigned int b,unsigned int c,int i)
{
int d = 0;
d = (b & c)>>i;
return d;
}
void NO_OFF (int a )
{
if(a==1)
printf("OFF\n");
else if(a==0)
printf("NO\n");
}
int main()
{
unsigned int data = 0;
scanf("%x",&data);
//判断温度是多少,并输出
int TEMP = RESO_32(data,Temp_MASK,24);
printf("温度:%d\n",TEMP);
//判断湿度是多少,并输出
int HUMI =RESO_32(data,Humi_MASK,16);
printf("湿度:%d\n",HUMI);
//判断门是否开着
int DOOR1 =RESO_32(data,Door_1_MASK,15);
NO_OFF(DOOR1);
int DOOR2 =RESO_32(data,Door_2_MASK,14);
NO_OFF(DOOR2);
int DOOR3 =RESO_32(data,Door_3_MASK,13);
NO_OFF(DOOR3);
int DOOR4 =RESO_32(data,Door_4_MASK,12);
NO_OFF(DOOR4);
int LIGH1 =RESO_32(data,Light_1_MASK,11);
NO_OFF(LIGH1);
int LIGH2 =RESO_32(data,Light_2_MASK,10);
NO_OFF(LIGH2);
int LIGH3 =RESO_32(data,Light_3_MASK,9);
NO_OFF(LIGH3);
int LIGH4 =RESO_32(data,Light_4_MASK,8);
NO_OFF(LIGH4);
return 0;
}
调试时发现scanf输入时我输入的是16进制,却用%d占位符来接收数据,导致没有出现bug,希望大家引以为戒