注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

蒙奇D小豌豆的博客

蒙奇D小豌豆的学习记录

 
 
 

日志

 
 

大端与小端以及网络字节序  

2012-03-30 16:34:12|  分类: network |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式

不同的编译器结构存储的方式不一样相同,这个和不同的机器内存中存放变量的字节序不同一个道理。我们知道,关于字节序有大端和小端之分。一般来说,Intel处理器使用的是小端(little endian),Moto处理器使用的是大端(记忆中好像就Intel的用小端,其它的基本上都是大端)。小端和大端的区别在于,内存对于变量的存放规则不同。对于小端来说:低位字节存放在内存中相对低地址;高位字节存放在内存中相对高地址。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。

16bit宽的数0x1234Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34


网络字节序:是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

linux中字节序转换宏:
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中 这些函数会把字节序进行转换 ,使用big endian类型的系统中 这些函数会定义成空宏。

大端小端检测方法:
  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。
int checkCPUendian()
{
union
{
unsigned int a;
unsigned char b;
}c;

c.a = 1;
return (c.b == 1);
}
/*return 1 : little-endian, return 0:big-endian*/ 


linux 字符串ip address转换为32位大端数字

static unsigned int get_dst_ip(char *buf)

{

      unsigned int a, b, c, d;/*a.b.c.d*/

      int ret;

      unsigned int ipaddr;

 

      printf("ip addr:%s\n", buf);

      ret = sscanf(buf, "%d.%d.%d.%d", &a, &b, &c, &d);

      assert(ret != -1);

      

      assert((a<=255) && (b<=255) && (c<=255) && (d<=255));

      ipaddr = a | b<<8 | c<<16 | d<< 24;

      printf("big end ipaddr:0x%x\n", ipaddr);

      return ipaddr;

}

  评论这张
 
阅读(357)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018