当前位置: 主页 > 日志 > 其它 >

网络字节序与主机字节序

在网络上存在不同的系统,在不同的系统中存储数据时所采用的字节排列顺是不同的,有的系统是高位在内存高位,低位在内存低位,而有的系统则刚好相反。

例如:
我在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("本机字节序为小段序! ");
 }
 else
 {
       printf("本机字节序为大段序! ");
 }
       return;
}





[日志信息]

该日志于 2009-02-25 17:48 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “网络字节序与主机字节序” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部