这个程序为什么要高低位互换

来源:百度知道 编辑:UC知道 时间:2024/05/10 12:30:05
计算MD5的程序最后结果为什么要高低位逆反输出

解释下这句#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24) //将x高低位互换,例如PP(aabbccdd)=ddccbbaa
http://zhidao.baidu.com/question/43188286.html?si=3
的最佳答案那个程序

数据经过MD5 hash后变成一个128位的code存储在内存中
这是没问题的,但是要用 printf("MD5 Code:%08x%08x%08x%08x\n",这种格式显示的话,对于little-endian机器(低位字节在前)会按每32位逆序显示。
比如内存中的11 22 33 44 55 66 77 88这64个字节,若调用printf("%08x%08x",l1,l2);来显示则会输出:
4433221188776655,故在输出时须做逆序处理。

那个超链接的那段程序需要在32位编译器上编译,在little-endian机器上运行。
比如x86机器。

--------------------------------------------------------
#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)

其中有四个部分:
x<<24 :将0-7位移至24-31位
(x<<8)&0xff0000 :将8-15位移至16-23位
(x>>8)&0xff00 :将16-23位移至8-15
x>>24 :将24-31位移至0-7位
最后由|操作符拼接

例如若x = 0x12345678;
则x<<24 为 0x78000000
(x<<8)&0xff0000 为 0x00340000
(x>>8)&0xff00 为 0x00005600
x>>24 为 0x00000012
最后结果是0x78000000|0x00340000|0x00005600|0x00000012为0x78563412