一 网络字节序
网络字节序有两种:
a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址(小端模式)
b.Big endian 高位存储在内存的低地址,低位存储在内存的高地址(大端模式)
网络字节序是TCP/IP协议中定义好的一种数据表示格式,它是与机器的cpu,操作系统什么的无关的。
网络字节序选择了Big endian。程序员必须把本地数据从主机字节序转换成网络字节序发送到主机,同时,主机也必须把收到的数据从网络字节序转换成本地字节序,这样才能保证双方正确的收发数据,不然就是产生bug。
winapi提供了四个函数用于进行网络字节序到本机字节序和本机字节序到网络字节序的转换:
htons:把unsignedshort类型从主机序转换到网络序
htonl:把unsignedlong类型从主机序转换到网络序
ntohs:把unsignedshort类型从网络序转换到主机序
ntohl:把unsignedlong类型从网络序转换到主机序
(这四个API可以这样记,s表示short,l表示long,n表示network,h表示host)
不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian
网络字节序实现兼容不同平台
if ISLE
/*小端字节序平台调用此部分代码*/
Long htonl(long value)
{
/*进行转换,即位置0x12345678转换位置0x78563412*/
return( (value << 24) | ( (value << 8) & 0x00ff0000) | ( (value >>8) & 0x0000ff00) | (value >> 24));
}
else if ISBE
Long htonl(long value )
{
/*大端平台与网络字节序一致,不需转换*/
return valur;
}
#endif
二检验本机字节序的简便方法:
//返回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;
}