c++ 简单的对内存的操作

最近做网络的实验题需要对内存进行操作。比如说对于一个数组
  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)<<endl;
但是这种做法有个问题就是x86架构的计算机采用的是小端序。所以对于这种情况在转换的过程中会把a放在低八位,把b放在高八位。但是这题的要求是把a放在高八位。所以这种做法虽然很直接但是求的结果采用的是大端序的。因此需要一个转换函数htons。这个函数在windows平台下需要头文件#include <Winsock2.h>,并且如果报错的话需要在项目工程-属性-链接器-命令行里添加其他选项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。

posted on 2011-10-25 13:31  hydah  阅读(316)  评论(0编辑  收藏  举报