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