这大概是入职之后遇到最多的问题,不过有时候还是会弄错,理解还是不够深刻的原因吧。

字节序

计算机存储数据是二进制形式,二进制每8位为一个字节。
字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序。

大端序

高位字节数据存放在低地址处,低位数据存放在高地址处。大端序0x1234567在内存中存储方式:

这种方式和人类读写数值的方法是一样的,所以更容易理解

小端序

高位字节数据存放在高地址处,低位数据存放在低地址处。小端序0x1234567在内存中存储方式:

这种方式下?都裂开了。

如何判断本地字节序

思路都比较简单,存放一个超过一字节的变量在内存,根据读出内存高位存的内容就可以判断出来。比如:

#include <stdio.h>
int main ()
{
  unsigned int x = 0x12345678;
  char *c = (char*)&x;
  if (*c == 0x78) {
    printf("Little endian");
  } else {
    printf("Big endian");
  }
  return 0;
}

网络序和主机序

RFC1700规定使用“大端”字节序为网络字节序,主机序根据本地的CPU类型可以是大端序或者小端序。这样在进行网络传输之前需要将主机序转为网络序,传输结束之后再由网络序转换为主机序。
- htonl()--"Host to Network Long"
- ntohl()--"Network to Host Long"
- htons()--"Host to Network Short"
- ntohs()--"Network to Host Short"


时间从来不语,却回答了所有问题