主机字节序和网络字节序(大小端)

561 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

1.大小端:

最常见的有两种:

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

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

LE little-endian(小端)

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

BE big-endian(大端)

  • 最直观的字节序;
  • 地址低位存储值的高位;
  • 地址高位存储值的低位;
  • 为什么说直观,不要考虑对应关系;
  • 只需要把内存地址从左到右按照由低到高的顺序写出;
  • 把值按照通常的高位到低位的顺序写出;
  • 两者对照,一个字节一个字节的填充进去;

例子:

/*
    例子:
    
    对于 32位整型数据 0x12345678, 它在大端和小端两种模式下是这样存储的:
    
    对于0x12345678:
        0x12是这个多字节的高位或高序
        0x78则是转给多字节的地位或低序
    
         低地址(可看作起始地址)  --------->  高地址
    小端:     0x78     0x56      0x34       0x12
    
    大端:     0x12     0x34      0x56       0x78
*/

2.主机字节序:

不同的主机有不同的字节序, 如 x86为小端模式, Motorla 6800为大端模式

3.网络字节序:

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

网络字节序规定, 收到的第一个字节被当作高位看待, 这就要求发送端发送的第一个字节应当是高位。 而在发送端发送数据时, 发送的第一个字节是该数据在内存中起始地址对应的字节

可见网络字节顺序采用 big endian(大端)排序方式

4.字节序的转换

只有在多字节数据处理时才需要考虑字节序;

运行在同一台计算机上的进程相互通信时,一般不用考虑字节序;

异构计算机之间通讯, 需要转换自己的字节序为网络字节序

5.优劣

大端小端没有谁优谁劣,各自优势便是对方劣势:

对于0x12345678的存储

  • 小端: 0x78 0x56 0x34 0x12
  • 大端: 0x12 0x34 0x56 0x78

小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。 大端模式 :符号位的判定固定为第一个字节,容易判断正负。

6.常见的大小端举例

一般操作系统都是小端,而通讯协议是大端的。

4.1 常见CPU的字节序

Big Endian : PowerPC、IBM、Sun Little Endian : x86、DEC ARM既可以工作在大端模式,也可以工作在小端模式。

4.2 常见文件的字节序

Adobe PS – Big Endian BMP – Little Endian DXF(AutoCAD) – Variable GIF – Little Endian JPEG – Big Endian MacPaint – Big Endian RTF – Little Endian

另外,Java和所有的网络通讯协议都是使用Big-Endian的编码。