字节序

Posted by Max on March 30, 2015

概述

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。单字节数据不受此影响。

常见序

  • LITTLE-ENDIAN

    采用LE (little-endian) 方式存储数据,将低序字节存储在起始地址,“低对低”, 符合人的思维习惯。

  • BIG-ENDIAN

    采用BE (big-endian) 方式存储数据,将高序字节存储在起始地址,“高位在前”,符合人的书写习惯。

BIG-ENDIAN、LITTLE-ENDIAN跟CPU有关的,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN、。IA架构(Intel、AMD)的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器是Big-Endian。这其实就是所谓的主机字节序

网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。

所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。

相互转换

为了进行转换, bsd socket提供了转换的函数有下面四个:

  1. htons 把unsigned short类型从主机序转换到网络序;

  2. htonl 把unsigned long类型从主机序转换到网络序;

  3. ntohs 把unsigned short类型从网络序转换到主机序;

  4. ntohl 把unsigned long类型从网络序转换到主机序;

注:在使用little endian的系统中,这些函数会把字节序进行转换,在使用big endian类型的系统中,这些函数会定义成空宏。所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。