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

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

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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值