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

原创 2015年07月07日 19:09:23

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

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

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。

相关文章推荐

字节序、位序

字节序     字节序,又称端序、尾序,英文单词为Endian,该单词来源于于乔纳森·斯威夫特的小说《格列佛游记》,小说中的小人国因为吃鸡蛋的问题而内战,战争开始是由于以下的原因:我们大家都认为,吃...
  • xhkl
  • xhkl
  • 2011年05月01日 09:56
  • 3383

IP地址点分十进制格式转换为网络字节序二进制以及八进制十六进制输出

如题,本篇文章是为了测试

C语言版和JAVA版 把一个字节正序(高位在前)转为逆序(低位在前) 和 逆序转为正序

一、C语言版 把一个字节正序(高位在前)转为逆序(低位在前) 和 逆序转为正序 // xhrrj.cpp : Defines the entry point for the console ap...

C语言中的位域、字节序、比特序、大小端

1.比特序 / 位序 /  bit numbering / bit endianness 我们知道一个字节有8位,也就是8个比特位。从第0位到第7位共8位。比特序就是用来描述比特位在字节中的...

科研办主任篇——重温C语言(1) 位、字节、字;我们要用windows api

2016年,我有幸成为山东大学威海校区2016级新生的科研办主任,这一定会是一段美好的回忆,也一定是值得我品味一生的经历。...
  • ds1231h
  • ds1231h
  • 2016年10月04日 11:58
  • 346

字节序与位序

  • 2012年02月15日 13:15
  • 134KB
  • 下载

socket编程 -- 网络字节序、IP地址转换、sockaddr数据结构

网络字节序内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言 位序 字节序 和 网络字节序 帧格式
举报原因:
原因补充:

(最多只允许输入30个字)