在网络上存在不同的系统,在不同的系统中存储数据时所采用的字节排列顺是不同的,有的系统是高位在内存高位,低位在内存低位,而有的系统则刚好相反。
例如:
我在Intel cpu (WinXp)上做了如下测试:
void main()
{
int a=0x1234;
}
查看内存发现:0x0012ff7c存放的是34而0x0012ff7d存放的是12,这就是小端序,而网络字节序采用的是大端序,即高位存放于低地址,低位存放于高地址。
实现字节序转化的函数有以下几个:
U_long htonl(U_long hostlong)将无符号长整型数从主机字节序转化为网络字节序
u_short htos(u_short hostshort)将无符号段整型数从主机字节序转化为网络字节序
u_long ntohl(u_long netlong)将无符号长整型数从网络字节序转化为主机字节序
u_short ntohs(u_short netshort)将无符号短整型数从网络字节序转化为主机字节序
测试:参加如下图片
如何检查一台机器是网络字节序还是小端序?
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。
图示如下:16进制数0x04030201
大端序:
高位地址 低位地址
x+3|x+2|x+1|x
01|02 |03 |04
小端序:
高位地址 低位地址
x+3|x+2|x+1|x
04|03 |02 |01
下面是一个检验本机字节序的简便方法:
//判断本机的字节序
//返回1表示为小段序。返回0表示为大段序
char am_big_endian ()
{
unsigned short i=1;
return *((char *)(&i));
}
void main()
{
if(am_big_endian())
{
printf("本机字节序为小段序!\n");
}
else
{
printf("本机字节序为大段序!\n");
}
return;
}