大小端 位域

针对内核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 <stdio.h>
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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值