在我们定义结构体时,从上往下,第一个成员占用这个结构体变量的最低地址。从上往下依次累加。当我们定义结构体位域时,也是这样,第一个定义的位字段,占用这个字节中的最低的位地址。最后一个占用高地址。所以说字节序和位序是统一的。
但是当我们编写网络程序的时候,要注意网络字节序和位序都是大端序的,而主机很多都是小端序。所以在网络中的第一个位字段通常放在一个字节的末尾,而在网络中的最后一个字节的位字段,则放在一个字节的前面。
typedef struct {
uint8_t type: 4;
uint8_t flag: 1; //1: control, 0:data
uint8_t extension: 1;
uint8_t R: 2;
} __attribute__((__packed__)) MacCtlHdr_t;
这个是小端序主机上的定义,对应于下图中的帧格式
typedef struct {
uint8_t RN_M4: 4;
uint8_t cause: 3;
uint8_t type: 1;
uint8_t RN_M8: 8;
uint8_t RN_L8: 8;
uint8_t R: 4;
uint8_t bsr: 4;
}__attribute__((__packed__)) RA_HEADER;
对应于这样的帧格式:
可以这样理解本地存储的是小端序,但是机器发送的时候是大端序。对已从每个字节的高位先行发送。所以顺序是第一字节的type,cause,RN4,之后是第二字节RNM8和第三字节RNL8,之后是第三字节的bsr和R。