关于字节序的一些备忘
zan
#技术#编程#Web开发
什么是字节序(背景)
现代计算机的内存可以看成是一个巨大的字节数组,对于普通的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中进行位运算时便不需要考虑字节序的问题了。