关于字节序的一些备忘

什么是字节序(背景)

现代计算机的内存可以看成是一个巨大的字节数组,对于普通的ASCII字符串,每一个字节就能表示一个完整的字母。 但是对于int32_t 这种数据类型,单个字节无法保存所有信息,便需要用多个字节来保存信息。每一个字节表示的含义都不一样, 位置便也成为了重要的信息之一。 就如同人类的阅读书写习惯一样,有的习惯从左到右,有的习惯从右到左。 计算机中不同的架构,处理多字节的数据时顺序也不一样,所以这里就有了字节序的概念。

字节序的具体概念

例如下面的数字 int32_t = 0x01020304; 保存到内存时有两种常见的方式

第一种方式如下:有效高字节在0x01在低字节的前面,这种我们称之为大端序(Big-Endin)

    0x01, 0x02, 0x03, 0x04 

第二种方式,低字节0x04在高字节的前面,这种我们称之为小端序(Little-Endin)序

    0x04, 0x03, 0x02, 0x01 

大小端使用场景

我们常用的intel X86/ AMD64 计算机上都是小端序。而在网络传输上,一般高字节的先发送,低字节的数据后发送,则是用的大端序。

大端序和小端序的转换

机器本身的字节序我们称之为本机字节序(可能是大端序也有可能是小端序), 当需要进行网络编程的时候, 可以通过下面的api把本机序转成网路序。

    16位 

    Ntohs 网络序转本机序 
    Htons 本机序转网络序   


    32位 

    Ntohl  网络序转本机序 
    Htonl  本机序转网络序 

对于64位的数,linux的头文件 endian.h 也定义了一系列的函数,用于将本机序转成大端序或者小端序。

位运算与字节序

一个让人困惑的问题是位运算的时候,需要考虑字节序吗? 这里先说结论,位运算时是不需要考虑字节序的。 因为字节序只是多字节的数据在内存中的排列顺序。 当数据都读到cpu中进行位运算时便不需要考虑字节序的问题了。

发表于: 2018年10月7日 13时43分