概念
主机序:主机序分大端模式(big-endian)和小端模式(little-endian)。
大端模式就是把数值的高字节内容存放在内存的低地址处,低字节内容存放在高地址处。
小端模式就是把数值的高字节内容存放在内存的高地址处,低字节内容存放在低地址处。
例如数据 int a = 0x12345678,假设存放的内存地址从0x0000开始。
地址 0x0000 0x0001 0x0002 0x0003
大端模式 0x12 0x34 0x56 0x78
小端模式 0x78 0x56 0x34 0x12
网络序:不同主机之间通信所规定的一种通用模式,即大端模式。
主机A-----------------网络序(大端)-----------------主机B
主机A与主机B通信,发出的信息必须是网络序,同理主机B与主机A通信,发出的信息必须是网络序。
因为这样可以避免两主机的主机序不一致而导致的通信故障。
怎么判断主机的主机序
将一个字节的数据和一个整型数据存放于同样的内存开始地址,通过读取整型数据,分析 char 数据在整型数据的高位还是低位来判断 CPU 工作于小端还是 大端模式。
方法一:
int checkCPU()
{
int num ,*q;
q = #
num = 0;
*(char *)q = 0xff;
return (num == 0xff)// num = 0xff 则为小端 ,否则为大端。
}
方法二:
int checkCPU()
{
union test
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1); // c.b=1 则为小端 ,否则为大端。
}
一般来说x86系列的CPU都是小端模式。
主机序与网络序之间的转换
#include <arpa/inet.h> //头文件
uint32_t htonl(uint32_t hostlong); //将uint32_t 型数据的主机序转为网络序
uint16_t htons(uint16_t hostshort); //将uint16_t 型数据的主机序转为网络序
uint32_t ntohl(uint32_t netlong); //将uint32_t 型数据的网络序转为主机序
uint16_t ntohs(uint16_t netshort); //将uint16_t 型数据的网络序转为主机序