网络字节序与主机字节序

作者在 2008-01-04 10:42:09 发布以下内容

在网络上存在不同的系统,在不同的系统中存储数据时所采用的字节排列顺是不同的,有的系统是高位在内存高位,低位在内存低位,而有的系统则刚好相反。
例如:
我在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;
}

 

TCP/IP | 阅读 4448 次
文章评论,共0条
游客请输入验证码
浏览585067次