字节序,顾名思义就是字节的顺序。更具体的讲,它是多字节数据存储和传输时,字节的顺序。java
由于物理内存是以字节为单位进行数据存储,也就是咱们常说的计算机基本单位为字节。
所以,单字节的数据(如c或java的char类型的数据)没有字节序这一说,由于获取它只须要读取一个字节。而多字节数据,因为有多个字节,因此在存储和传输可使用不一样的顺序进行操做。数组
十六进制数 0x12345678 共占4个字节,分别是0x十二、0x3四、0x5六、0x78,所以在该数字中0x12属于高位数据,0x78属于地位数据。网络
注:
能够把内存当作是一个很大的数组,4G内存则是一个长度为4294967296的数组。
该数组的索引其实就是内存地址,左边是比较小的地址,右边则愈来愈大,直至最大值。
第一种顺序:低地址存放高位数据,叫大端模式spa
第二种顺序:低地址存放低位数据,叫小端模式code
二者,大端模式比较符合人类的阅读习惯;小端模式更符合计算机的处理方式,由于计算机从低位开始处理。blog
网络序:也称为网络字节序,都是大端模式。由于TCP/IP协议对各层协议统一规定采用大端模式。索引
主机序:机器的字节序,有大端模式也有小端模式,根据具体机器的处理决定的,小端模式较常见。图片
那么,在进行网络通信时,在将本地数据发送到网络上就须要注意这个顺序。若是本地机器的字节序是小端模式,则须要先转换成大端模式后再进行发送;若是本地已是大端模式,则能够直接发送。内存
ps.在私有协议上的数据,只要收发两端约定好,用什么顺序都行。不过,仍是建议用网络序发送。it
int main() { int x = 0x1020304; char* p = (char*)&x; if(p[0]==1){ printf("Big\n"); } else{ printf("Little\n"); } return 0; }
public class HelloEndian { public static void main(String[] args) { ByteBuffer b = ByteBuffer.wrap(new byte[4]); b.order(ByteOrder.BIG_ENDIAN); b.putInt(0x01020304); System.out.println("Big-Endian: " + Arrays.toString(b.array())); b = ByteBuffer.wrap(new byte[4]); b.order(ByteOrder.LITTLE_ENDIAN); b.putInt(0x01020304); System.out.println("Little-Endian: " + Arrays.toString(b.array())); } }