在实际的项目当中,我们得到一些整型(int)变量,变量的某八位保存的是具有特殊意义的字符的ascII码,在应用过程中需要将其转换为对应的字符。下面介绍两种将整型变量按位转换为字符型变量的方法:
1、使用字符数组:
使用字符数组进行转换的方法是:先将整型变量和0xFF(或者0xFF00、0xFF0000、0xFF000000)做按位与运算,取出相应的位,然后将其赋值给字符数组的某一位,并在最后添加零表示结束。
<span style="font-size:18px;"> int num = 0x4b584f53;
char charnum[] = {num & 0xFF,(num & 0xFF00) >> 8,(num & 0xFF0000) >> 16,(num & 0xFF000000) >> 24,0};
cout<<charnum<<endl;</span>
程序解释:1)首先将一个用十六进制表示的整形数赋值给一个int型变量;
2)声明了一个char型数组(数组的大小为sizeof(int)+1),用于存放通过按位与获取的每一个字节;移位操作符">>"是去掉末尾的零,只获得特定的8位;在多出来的一位赋值为0,表示字符串结束(null的ascii码为0也即为'\0')。
3)最后输出结果;
2、使用共用体:先介绍一下共用体。共用体的定义方式如下:
union <共用体类型名>
{
<共用体类型的成员变量说明语句表>
};
共用体的定义方式和结构体有些相似,但是在结构体中每个数据成员都要单独占用一个存储字节,结构体类型的变量的长度等于其所有成员的长度之和。在共用体中虽然定义了多个变量,但是在每一瞬间只有一个成员起作用。两者的主要区别就是共用体类型的变量的各个成员共享内存的同一段空间,其总长度等于其最大成员的长度,而结构体的总长度则是由结构体的所有成员长度的综合构成。
利用共用体进行转换的程序如下:
<span style="font-size:18px;"> int num = 0x4b584f53;
union charnum {int v; char c[5];};
charnum num1;
num1.v = num;
num1.c[4] = '\0';
cout<<num1.c<<endl;</span>
代码解释:1)赋值给int型变量;
2)声明一个共用体,有两个变量,总长度为5个字节(按共用体的定义可知);int型用于存放对应的int变量,char[5]用来存放字符结束标志‘\0’。需要明确的一点:字符结尾标志'\0'虽然不计入字符串长度,但是需要占用内存空间。长度为n的字符型数组只能存储n-1个字符,最后一位用来存储结束标志。
3)定义一个union型变量;
4)将整型数直接赋给union中的第一个变量;
5)在共用体的末尾添加字符串结束标志,即char型变量的最后一位;
6)将这个共用体看成char型数组进行输出;
3、采用循环方法:
最笨的方法就是循环:先用按位操作取出每个字节,然后强制转换成char型并输出,循环的次数为4.
程序:
<span style="font-size:18px;"> int num = 0x4b584f53;
for(int i = 0; i < 4 ; i++)
{
cout<<(char)(ex & 0xFF);
ex = ex >> 8;
}</span>
程序的具体思路与第一重方法一样,这里不多做解释;
由于个人能力有限,解释有不明确或者错误的地方,希望指正,多多交流,共同进步!!!