网络传输:大小端

什么是大端序(Big-Endian)和小端序(Little-Endian)

  • Little-Endian 就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,从高地址开始读取数据。
  • Big-Endian 就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,从低地址开始读取数据。

示例: 数据:0x12345678 低字节:0x78 高字节:0x12

小端序: 内存地址顺序(低-高): 0x0000,0x0001,0x0002,0x0003 数据在内存存储顺序: 0x78,0x56,0x34,0x12 数据读取顺序(高-低): 0x12,0x34,0x56,0x78

大端序: 内存地址顺序(低-高): 0x0000,0x0001,0x0002,0x0003 数据在内存存储顺序: 0x12,0x34,0x56,0x78 数据读取顺序(低-高): 0x12,0x34,0x56,0x78

网络传输是大端还是小端?

网络传输采用的是大端字节序。这是因为网络传输的标准,如TCP/IP协议中的字节序,规定数据要以大端形式进行传输。这样做的好处是与任何一端的计算机系统无关,确保了数据的正确性和一致性。无论是在发送还是接收数据时,都需要对数据进行相应的字节序转换,以便在整个网络通信过程中保持统一的字节序标准。

X86是大端还是小端?

x86 架构是小端字节序(Little-Endian),大多数现代计算机体系结构都采用小端字节序,而不仅仅是 x86 架构。在 x86 架构中,最低有效字节(Least Significant Byte,LSB)存储在最低地址处,最高有效字节(Most Significant Byte,MSB)存储在最高地址处。

大小端转换

可以使用函数如 htonl、htons、ntohl、ntohs 等来进行字节序的转换

对于小于等于32位的数字来说,C语言有库进行转换,例如:

  • ntohl: 将一个无符号长整形数从网络字节顺序转换为主机字节顺序
  • htonl: 将一个32位数从主机字节顺序转换成网络字节顺序

参考