现代cpu的累加器一次都能装载至少4个字节(32位),那么这四个字节在内存中的排列的排序将影响它被累加器装载成的整数的数值,这就是字节序问题。字节序分为大端字节序(big endian)和小端字节序(little endian),大端字节序是指低地址存高字节,高地址存放低字节。小端字节序则恰恰相反
判断机器字节序代码
#include <stdio.h>
void byteorder()
{
union
{
short value;
char union_bytes[sizeof(short)];
}test;
test.value=0x0102;
if(test.union_bytes[0]==1 && test.union_bytes[2]==2)
{
printf("big endian\n");
}
else if(test.union_bytes[0]==2 && test.union_bytes[2]==1)
{
printf("lettle endian\n");
}
else
{
printf("unknown...\n");
}
}
现代PC大多采用小端字节序,因此小端字节序又称主机字节序
当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之,解决问题的方法:发送端总是把要发送的数据转换成大端字节序后在再发送,而接收端知道对方传送过来的数据总是大端字节序,所以自身采用措施转换(小端机转换大端,大端则不用转换)
因此大端字节序也称网络字节序
Linux提供了4个函数来完成主机字节序和网络字节序之间的转换
#include <netinet.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
长整形函数通常用来转换IP地址
短整形通常用来转换端口号