字节序-大端与小端

字节序总是搞混,这里整理一下:

1、计算机单位:

位(bit):计算机的最小单位,可以表示0 和 1

字节(byte):8个位组成一组 ,称为字节,每个字节可以表示一个文本字符;

2、什么是字节序:

字节序:指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

大端字节序:把值的高字节存到低地址,我们平时书写都用这种字节序。

小端字节序:把值的低字节存到低地址

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。

人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。

例如:

16进制数(共占三个字节) 大端字节序存储 小端字节序存储
0x112233 【11是高字节 33是低字节】 11 22 33 33 22 11
3、网络字节序

计算机之间通过网络进行通信时 需要保持一致的字节序

RFC规定使用“大端”字节序作为网络字节序,所以在网络传输时,发送时需要先在自己的主机上转换为网络字节序,接受到数据再转化为自己主机的字节序

4、查看自己主机自己序

可以用一段代码查看自己主机的字节序

#include <stdio.h>
int main ()
{
     int number = 1;   //0x00000001
     if(*(char *)&number == 1){
         printf("Little-endian!\n”); 
    }else{
        printf("Big-endian!\n");
    }
    return 0;
}

int类型的1,在小端字节序下最低位为1,在大端字节序下,最高位为1。所以可以通过判断最低位是否为0来确定该机器的字节序是什么。

Mac下是小端字节序

5、参考资料:

1、理解字节序

2、字节序”是个什么鬼?

3、字节序(byte order)和位序(bit order)

4、Byte and Bit Order Dissection