网络字节序

 一 网络字节序

网络字节序有两种:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值