我们有时候经常被大端,小端,网络字节序搞得很迷糊,本文理清一些概念,并给出可移植的代码。
我们的主机字节序,即我们的机器存放内存里的顺序,有两种,一种是大端,另一种是小端,大部分的系统都是小端。
在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节,比如一个unsigned short的变量的值为十六进制"0x0a 0x0b"对应的十进制2571,这个变量跨了1个字节,占了两个字节,内存的地址都是从低位到高位的,那么0x0b是字数据的低字节,应该存储在低地址,0x0a应该存储在高地址,所以这个变量对应的内存字节buff应该是"0x0b 0x0a"。大端正好相反,低地址中存放的是字数据的高字节。
既然不同的机器可能字节序不同,那么网络中发送的数据会不会乱序呢?这里就引出了网络字节序,网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian大端排序方式。
我们可以想到,如果一个unsinged short的变量值代表一个东东的长度,是十六进制"0x0a 0x0b"对应的十进制2571,那么它传送到网络上采用大端模式,对应的字节buff也是"0x0a 0x0b",和我们的主观顺序一致。而接收端如果是大端,则直接将该buff将转为unsigned short型就可以了,如果是小端,强转后肯定乱了序。下面贴上可移植代码。
#include <byteswap.h>