这大概是入职之后遇到最多的问题,不过有时候还是会弄错,理解还是不够深刻的原因吧。
字节序
计算机存储数据是二进制形式,二进制每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"
Comments | NOTHING