Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91948
  • 博文数量: 20
  • 博客积分: 474
  • 博客等级: 下士
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-27 18:43
文章分类

全部博文(20)

文章存档

2011年(20)

分类: C/C++

2011-05-15 01:54:01

最近做网络的实验题需要对内存进行操作。比如说对于一个数组
  1. char tempstr[2];
  2. tempstr[0] = 'a';
  3. tempstr[1] = 'b';
要取十六位赋给一个unsigned short型的变量。对于这种要求有一下几种作法:
1:
  1. unsigned short temp = 0;
  2. temp = *(unsigned short *) tempstr;
  3. cout <<  htons(temp)<
但是这种做法有个问题就是x86架构的计算机采用的是小端序。所以对于这种情况在转换的过程中会把a放在低八位,把b放在高八位。但是这题的要求是把a放在高八位。所以这种做法虽然很直接但是求的结果采用的是大端序的。因此需要一个转换函数htons。这个函数在windows平台下需要头文件#include ,并且如果报错的话需要在项目工程-属性-链接器-命令行里添加其他选项Ws2_32.lib 。这样通过这个函数转换后就为小端序了(事实上ntohs也可以,如果从函数用意上来说转小端序应该用这个函数,不过效果一样)。
2:
  1. unsigned short ((((unsigned short)'a'<<8)&0xff00)|((unsigned short)'b'&0x00ff))
这种方法是先强制类型转换,然后将高八位乘以二的八次方,在通过与或操作把需要保留的位保留,这是个很直接的方法,用意清楚。其实是推荐操作。
3:
  1. unsigned short((unsigned short)a<<8) + (unsigned short) b
这种方法是对于unsigned short型执行加法操作。这个方法和上个方法对于此题效果相同,但是用的范围没有上个方法广。


PS:htons和ntohs是一对,其处理的是16为的数据--short。htonl和ntohl为一对,其处理的是32位数据-long。
阅读(1397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~