- 字节序的定义
- 几种类型的字节序
- cpu字节序
- 外部bus字节序
- 设备字节序
- 络协议字节序
- Ethernet协议字节序
- IP协议字节序
- 编译字节序
- 几种类型的字节序
- 比特序的定义
- 字节序与bit序的转换
- 结构体的位域
字节序的定义
几种类型的字节序
参考如下图的计算机系统:
h_dest 和h_source 是字符串,因此不必考虑字节序的问题。h_proto是整型值,因此在主机访问该字段是需要使用ntohs,在主机填充该字段时要htons。
至于比特序的传输顺序下文有介绍。
IP协议字节序
IP协议字节序是大端。bit序继承自CPU的, 卡负责线上转换bit序列。
以下为ip header的结构体:
version 和 ihl 字段:
根据ip协议,version是ip头首字节的高有效4bit ,ihl是低有效bit.
有两种方法访问这两个字段:
1.直接解析法
假如ver_ihl代表ip头的首字节则ipl=ver_ihl&0xf,version=ver_ihl>>4,不论主机是那种字节序。
2.结构体位域法
定义如上的结构体,假如主机是小端,我们定义ihl在version之前,如果是大端正好相反。应用Kevin’s Theory #2 如果位域A定义在位域B之前,那么位域A总是出现在低序的比特位。正好可以满足我们的访问要求。
编译字节序
CPU的字节序影响CPU的指令集。不同的GNC C工具链为了编译C代码应该使用相应CPU的大小端。例如mips-linux-gcc和mipsel-linux-gcc是被用来分别编译大端的和小端的MIPs代码。
比特序的定义
比特序就是一个字节中的bit顺序问题。一般情况下系统的比特序和字节序是保持一致的。 对应分为以下情况:
LSB 0 位序:字节的第0位存放数据的least significant bit,即我们的数据的最低位存放在字节的第0位。(对应小端字节序)
MSB 0 位序:节的第0位存放数据的most significant bit,即我们的数据的最高位存放在字节的第0位。(对应大端字节序)
LSB是指 least significant bit,MSB是指 most significant bit。
比特序1 0 0 1 0 0 1 0在大端系统中最高有效比特位为1、最低有效比特位为0,字节的值为0x92。在小端系统中最高、最低有效比特位则相反为0、1,字节的值为0x49。
跟字节序类似,要想保持一个字节值不变那么就要使系统能正确的识别最高、最低有效比特位。
字节序与bit序的转换
结构体的位域
对于位域有一个约定:在C语言的结构体中如果包含了位域,如果位域A定义在位域B之前,那么位域A总是出现在低序的比特位。
参考如下代码:
小端机器A上的结果
对应字节上的bit序如下图:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!