Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208342
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 09:41
文章分类
文章存档

2020年(1)

2018年(1)

2017年(30)

2016年(30)

2015年(3)

我的朋友

分类: C/C++

2017-06-29 20:32:32

原文地址:大小端 位域 作者:zimang

针对内核IP头version 和 ihl在大小端异位的一些介绍:
 
version先定义的,应该在高位啊,即most significant 4 bits。

可以这样来解释,
1)从道理上来说,little endian中的位应该这样排列:
01234567
即排在前面的是低位。因此,先分配least significant bits
2)而在Big endian中,位应该这样排列:
76543210
即排在前面的是高位。因此,先分配most significant bits。

可以这样来理解,
1)在Big Endian的情况下,"排在前面的是高位"
a. 对于顺序的两个字节来说,第一个字节是高位(排在前面),第二个字节是低位(排在后面)。
b. 对于字节内部的位来说,
-------most significant bits排在前面,是高位,
-------least significant bits排在后面,是低位。
2)在Little Endian的情况下,"排在前面的是低位"
a. 对于顺序的两个字节来说,第一个字节是低位(排在前面),第二个字节是高位(排在后面)。
b. 对于字节内部的位来说,
-------least significant bits排在前面,是低位,
-------most significant bits排在后面,是高位。

这样,在对struct中的成员进行分配的时候,"按排列顺序分配,先分配排在前面的"
1)big endian从高位向低位分配,
a. 对字节,是先分配低地址的字节,再分配高地址的字节。
b. 对位域,先分配most significant bits,再分配least significant bits。
1)little endian从低位向高位分配,
a. 对字节,是先分配低地址的字节,再分配高地址的字节。
b. 对位域,先分配least significant bits,再分配most significant bits。

======================================

以上说的都是分配的顺序。

对于IP协议来说,
1)IP's byte order is big endian.
2)The bit endianness of IP inherits that of the CPU,
3)and the NIC takes care of converting it from/to the bit transmission/reception order on the wire.

并且,按照IP协议,
1)"version" is the most significant four bits of the first byte of an IP header.
2)"ihl" is the least significant four bits of the first byte of the IP header.

也就是说,version必须分配在most significant four bits,
按照上面说的分配顺序,在big endian中,version必须放在前面。

#include
int main()
{
char* c;
struct bitfield {
int ia:3;
int ib:2;
int ic:3;
} field;
field.ia=4;
field.ib=2;
field.ic=2;

c=(char *) &field;
printf("%d ",*c);
return 0;
}
>在对struct中的成员进行分配的时候,"按排列顺序分配,先分配排在前面的"

struct 排列成 100 10 010

>1)little endian从低位向高位分配,
>b. 对位域,先分配least significant bits,再分配most significant bits。

按照字面上理解,分配后成 010 01 001 (76543210) 实际上是 010 10 100

所以:先分配 least significant 3 bits,再分配middle 2 bits,最后分配most significant 3 bits。

就像这样:

>1)"version" is the most significant 4 bits of the first byte of an IP header.
>2)"ihl" is the least significant 4 bits of the first byte of the IP header.
 
所谓的“对位域,先分配least significant bits,再分配most significant bits”
并不是说分配是bit by bit的,而是根据结构的定义,以结构成员为单位,一组一组地,依次分配到位组。

ia=100排在最前面,因此作为一组,分配到least significant 3 bits,
ib=10排在中间,因此作为一组,分配到接下来的middle 2 bits,
ic=010排在最后面,因此作为一组,分配到most significant 3 bits。
阅读(1384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~