字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。
大端字节序和小端字节序
如果处理器架构支持大端字节序(big-endian),最低有效字节(Least Significant Byte)包含最大字节地址。小端字节序(little-endian)则相反,最低有效字节包含最小字节地址。
注意:不管字节序如何,最高有效字节(Most Significant Type)总在左边,最低有效字节总在右边。
大端:
n | n+1 | n+2 | n+3 |
---|---|---|---|
MSB | LSB |
小端:
n+3 | n+2 | n+1 | n |
---|---|---|---|
MSB | LSB |
网络字节序
网络协议指定了字节序,因此异构计算机系统能够交换协议信息而不会被字节序所混淆。TCP/IP协议栈使用大端字节序(把接收到的第一个字节当作最高有效字节看待,这就要求发送端发送的第一个字节是高位字节)。所以,网络字节序(NBO)是大端字节序。
对于TCP/IP应用程序,有四个用来处理器字节序(主机字节序)(NBO)和网络字节序之间的实施转换函数:
#include <arpa/inet.h>
unit32_t htonl(unit32_t hostint32); //返回以网络字节序表示的32位整数
unit16_t htons(unit16_t hostint16); //返回以网络字节序表示的16位整数
unit32_t ntohl(unit32_t netint32); //返回以主机字节序表示的32位整数
unit16_t ntohs(unit16_t netint16); //返回以主机字节序表示的16位整数