关于网络字节序--大小端分析

学习ASN.1过程中看到了涉及大小端的内容,感觉其中分析是我见过最清晰的了,因此就将其贴出,以供参考。

大小端(Bid Endian vs.  Little Endian

来源于Swift的小说Gulliver’s Travels中一个故事:两个国家连年征战,起因在于吃煮鸡蛋时到底是从比较尖的一端开始,还是从比较圆的一端开始。

不幸的是类似事情在计算机中也存在如下情况:

l           大端方式-MotorolaPPC系列,IP协议中(MSDN中说的网络序)

l           小端方式-VAX计算机,Intelx86系列(MSDN中说的主机序)

字段内部的比特高低次序相同(左高右低),而字段之间的高低次序相反。

 

32位系统中我们分以下这些情况来一一说明:

1)         Byte类型(8bits

在只有一个字节的情况下,大端方式和小端方式没有分别。如:0x34

 

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

Bid Endian

0

0

1

1

0

1

0

0

0x34

 Little Endian

0

0

1

1

0

1

0

0

0x34

2)         Short类型(16bits

大小端方式之间有差别。如:0x1234

 

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

Bid Endian (0)

0

0

0

1

0

0

1

0

0x12

Bid Endian (1)

0

0

1

1

0

1

0

0

0x34

Little Endian (0)

0

0

1

1

0

1

0

0

0x34

Little Endian (1)

0

0

0

1

0

0

1

0

0x12

3)         Long类型(32bits

大小端方式之间有差别。如:0x12345678

 

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

Bid Endian (0)

0

0

0

1

0

0

1

0

0x12

Bid Endian (1)

0

0

1

1

0

1

0

0

0x34

Bid Endian (2)

0

1

0

1

0

1

1

0

0x56

Bid Endian (3)

0

1

1

1

1

0

0

0

0x78

Little Endian (0)

0

1

1

1

1

0

0

0

0x78

Little Endian (1)

0

1

0

1

0

1

1

0

0x56

Little Endian (2)

0

0

1

1

0

1

0

0

0x34

Little Endian (3)

0

0

0

1

0

0

1

0

0x12

 

4)         位域的情况:

大小端方式之间有明显的差别。位域对于C语言开发人员的主要用处可能就是在数据结构中设定每个变量占用的位数。

在一个字节内,如3-4-1结构下的{4, 15, 0}

 

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

Bid Endian

1

0

0

1

1

1

1

0

0x9E

Little Endian

0

1

1

1

1

1

0

0

0x7C

 

跨字节,边界不对齐,如5-4-7结构下的{2, 15, 0}

 

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

Bid Endian (0)

0

0

0

1

0

1

1

1

0x17

Bid Endian (1)

1

0

0

0

0

0

0

0

0x80

Little Endian (0)

0

0

0

0

0

0

0

1

0x01

Little Endian (1)

1

1

1

0

0

0

1

0

0xE2


你可能感兴趣的:(大小端)