现在的位置: 首页 > 综合 > 正文

DWORD 和4个char之间的相互转换

2012年12月09日 ⁄ 综合 ⁄ 共 897字 ⁄ 字号 评论关闭

DWORD -> 4 Char:

const static DWORD  kCmdRefreshUI = 'ABCD';在内存中是以DCBA的方式存的: 

直接把内存拷贝过来是倒序的:DCBA,反转就可以了。
(注意这个小端机器,大端机器就不需要反转,上图右边是高位地址)。
memcpy(buffer,&kCmdRefreshUI,sizeof(DWORD));
string cmd = string(buffer);
reverse(cmd.begin(),cmd.end());

 4 Char -> DWORD: 

开始操作之前buffer里面是"ABCD",因为我们是小端机器,所以我们期望转成功之后内存显示为"ABCD"。DWORD是unsigned long类型,是4*8位的,就是说每一个8位对应一个字母。一次性赋值比较困难,我们可以一次赋值一个char,用位 “|” 操作就可以把Char拷贝到对应的8 位里面,因为"|"是“有一则一”。赋值完一个字符之后,我们可以把DWORD里面还未赋值的字节位位移过来再次赋值,这个是位移操作">>" "<<"的强项,具体用到哪个需要看我们先赋值高位还是低位。我用的最先赋值高位,然后DWORD依次向左移一个8
位,在赋值下一个8位。见下图:
printf("%08x\n",tmpRCcmd<< 0);
tmpRCcmd = (tmpRCcmd << 0 )| buffer[3];  
printf("%08x\n",tmpRCcmd<<8);
tmpRCcmd = (tmpRCcmd << 8 )| buffer[2]; 
printf("%08x\n",tmpRCcmd<<8);
tmpRCcmd = (tmpRCcmd << 8 )| buffer[1]; 
printf("%08x\n",tmpRCcmd<<8);
tmpRCcmd = (tmpRCcmd << 8 )| buffer[0]; 
printf("%08x\n",tmpRCcmd);
 
 
LCL_data原创与CSDN 博客,转载请注明出处。

抱歉!评论已关闭.