主机字节序和网络字节序

Posted mazg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主机字节序和网络字节序相关的知识,希望对你有一定的参考价值。

 

不同的CPU有不同的字节序类型,这些字节序是指 整数 在内存中保存的顺序,这个叫做 主机序。最常见的有两种:

1Little endian:将低序字节存储在起始地址

2Big endian:将高序字节存储在起始地址

LE little-endian(小端)

  1. 最符合人的思维的字节序;
  2. 地址低位存储值的低位;
  3. 地址高位存储值的高位;
  4. 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说; 
  5. 低位值小,就应该放在内存地址小的地方,也即内存地址低位;
  6. 反之,高位值就应该放在内存地址大的地方,也即内存地址高位;

BE big-endian(大端)

1) 最直观的字节序;

2) 地址低位存储值的高位; 

3) 地址高位存储值的低位;

4) 为什么说直观,不要考虑对应关系; 

5) 只需要把内存地址从左到右按照由低到高的顺序写出;

6) 把值按照通常的高位到低位的顺序写出;

7) 两者对照,一个字节一个字节的填充进去;

例子:在内存中双字 0x01020304(DWORD) 的存储方式 

Addr: 4000 4001 4002 4003
LE  :  04  03    02   01
BE  :  01  02    03   04

x86系列CPU都是little-endian的字节序。网络字节顺序采用big endian排序方式。

网络字节顺序TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

我们知道计算机正常的内存增长方式是从低到高(当然栈不是),取数据方式是从基址根据偏移找到他们的位置,从他们的存储方式可以看出,大端存储因为第一个字节就是高位,从而很容易知道它是正数还是负数,对于一些数值判断会很迅速。而小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。



以上是关于主机字节序和网络字节序的主要内容,如果未能解决你的问题,请参考以下文章

主机字节序和网络字节序

网络字节序和主机字节序

主机序和网络序以及使用例子

主机字节序和网络字节序

python通过ntohl和htonl等函数实现主机字节序和网络字节序相互转换

Python网络编程——主机字节序和网络字节序之间的相互转换