字节顺序 endian
计算机系统一般采用字节(Octet,8 bit )作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:大端Big Endian 和 小端 Little Endian。
大端序:高位字节放到内存的低地址端,低位字节排放在内存的高地址段; 小端序:低位字节存放在内存的低地址段,高位字节排放在内存的高地址段。
判断大端小段(C++):
栈地址的申请是由高到低的!!!
const int endian = 1;
#define is_bigendian() ((*(char*)&endian) == 0)
#define is_littlendian() ((*(char*)&endian) == 1)
bool IsLittleEndian()
{
union
{
int val;
char c;
}u;
u.val = 1;
if(u.c == 1)
{
//小端
return true;
}
else
{
//大端
return false;
}
}
网络字节序(Network Byte Order,NBO)
按照从高到低的顺序存储,在网路上使用统一的网络字节顺序,可以避免兼容性问题。(即为大端序,TCP/IP中使用的字节序)。
主机字节序(HBO ,Host Byte Order)
不同的机器HBO不相同,与CPU设计有关。不同机器之间通信,需要转换为网络字节序来通信。相关转换函数如下:
htonl():将主机字节顺序转化为32位网络字节顺序
ntohl():将网络字节顺序转换为32位主机字节顺序
htons():将一个16位数从主机字节顺序转化为网络字节顺序
ntohs():将一个无符号端整型数从网络字节顺序转换为主机字节顺序
inet_ntoa():将网络地址转换成"."点隔的字符串格式,返回一个字符指针
inet_addr():将IP从点数格式转换成无符号长整型(错误返回-1,与IP地址255.255.255.255相符合)