1.结构体位定义
在工作中,经常遇到按位(bit)定义结构体 的情况。由于一个字节有8个位,这时,程序员往往对bit的位置产生困惑。现在给出2个例子,来说明位的定义次序。
第一个例子是将unsigned char 分成8个比特。
#pragma pack(push,1)
typedef struct ST_TEST
{
unsigned char ucA:1;
unsigned char ucB:1;
unsigned char ucC:1;
unsigned char ucD:1;
unsigned char ucE:1;
unsigned char ucF:1;
unsigned char ucG:1;
unsigned char ucH:1;
} ST_TEST;
#pragma pack(pop)
#include <string.h>
#include <stdio.h>
int main(void)
{
ST_TEST stTest;
stTest.ucA = 1;
stTest.ucB = 0;
stTest.ucC = 0;
stTest.ucD = 0;
stTest.ucE = 0;
stTest.ucF = 0;
stTest.ucG = 1;
stTest.ucH = 0;
unsigned char ucTest;
memcpy(&ucTest, &stTest, 1);
printf("%x", ucTest);
scanf("%c", &ucTest);
return 0;
}
结果是0x41,也就是二进制的0b01000001。
可见,定义在一开头的ucA反而落到了最后,而倒数第二的ucG起始在左起正数第二。
所以,结构体里定义比特,次序起始是反的。
2.实例
现定义数组及含义如下:
data[0]=chargerbox_state;
data[1]=chargerbox_battery_level;
data[2]=0x00;
typedef struct CHARGERBOX_STATE
{
uint8_t reserved:3;
uint8_t open:1;
unin8_t chargeredbyUSB:1;
uint8_t chargeredbyWireless:1;
uint8_t left_ear_in_chargerbox:1;
uint8_t right_ear_in_chargerbox:1;
}chargerbox_state;
在 XCOM接收到数据为
88 15 00
即
data[0] = 88;
data[1] = 15;
data[2] = 00;
其中,88 二进制为 1000 1000;
对应到结构体中
uint8_t reserved:3;
uint8_t open:1;
unin8_t chargeredbyUSB:0;
uint8_t chargeredbyWireless:0;
uint8_t left_ear_in_chargerbox:0;
uint8_t right_ear_in_chargerbox:1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)