关闭

C语言 位序 字节序 和 网络字节序 帧格式

614人阅读 评论(0) 收藏 举报
分类:

在我们定义结构体时,从上往下,第一个成员占用这个结构体变量的最低地址。从上往下依次累加。当我们定义结构体位域时,也是这样,第一个定义的位字段,占用这个字节中的最低的位地址。最后一个占用高地址。所以说字节序和位序是统一的。

但是当我们编写网络程序的时候,要注意网络字节序和位序都是大端序的,而主机很多都是小端序。所以在网络中的第一个位字段通常放在一个字节的末尾,而在网络中的最后一个字节的位字段,则放在一个字节的前面。

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。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:71548次
    • 积分:1354
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:113篇
    • 译文:0篇
    • 评论:1条
    最新评论