$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";  
 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);  
 对md5加密后返回的16位二进制字节进行异或操作  
 $data =  array();  
  $data[0]="0";  
 for($i = 0; $i < strlen($md5); $i++){  
     $data[$i % 4 +1] ^=$md5[$i];  
 }  
 然后获得一个整数值  
  $val = 0;   
         $val = $bytes[$data+1] & 0xff;   
         $val <<= 8;   
         $val |= $bytes[$data+ 2] & 0xff;   
         $val <<= 8;   
         $val |= $bytes[$data+ 3] & 0xff;   
         $val <<= 8;   
         $val |= $bytes[$data+4] & 0xff;   
 echo $val;  
 为何返回的值不正确呢?是不是我哪里有错误了?请各位指点下  
  
   回复讨论(解决方案)
   你应该说清楚你想做的事情是什么啊,就是你正确的逻辑是什么。而且你的代码本身也是有syntax error的。我也没看出来你想做什么。 
   感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数 
   你说结果不正确,那么正确的值是什么呢?  
 你只给了代码片段,无法测试 
   
   感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数  
     1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5  
 2. 你这次的描述并没有比你代码中的注释给出更多的信息,请像一个程序员一样来描述。比如你说 每8位做一次异或,异或是一个二元操作操作符,那它是和谁异或。  
 3. 如楼上所述,你认为实现有问题,那请给出一个输入应该得到的正常的输出  
 4. 看我第一次回复,请先打理好自己的代码,把它写成可运行的版本,并且只保留与问题本身相关的部分,就算有逻辑错误也不能有语法错误。      
  
   你说结果不正确,那么正确的值是什么呢?   
 你只给了代码片段,无法测试  
   这往往解释了为什么国内程序员越来越多,而这些曾经老牌的中文技术社区均已没落了。  
 想如果再遇到不好好提问题的,应该封号,然后找个类似“提问的智慧”的文档,让被封人的朗诵一遍录音发过来手动解封。录音中同时要朗读发给这个人的一段验证码,避免作弊。  
 以后再不好好问问题,也不封此人的号了,就把他自己的朗诵链接回在问题后面。    
 PS: 我今天是有多闲.  
  
   
    
 感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数   
       1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5   
 2. 你这次的描述并没有比你代码中的注释给出更多的信息,请像一个程序员一样来描述。比如你说 每8位做一次异或,异或是一个二元操作操作符,那它是和谁异或。   
 3. 如楼上所述,你认为实现有问题,那请给出一个输入应该得到的正常的输出   
 4. 看我第一次回复,请先打理好自己的代码,把它写成可运行的版本,并且只保留与问题本身相关的部分,就算有逻辑错误也不能有语法错误。      
  好的谢谢如此耐心的回答啊,用java运行了一段代码,然后用php运行了一段代码,但是结果确不一样,也许我描述太模糊了,先看代码吧。  
 java代码:    
 String data = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";  
 String apSecert="0E2C83D839C026A5E0530100007FEB90";  
 ByteArrayOutputStream stream = new ByteArrayOutputStream();  
 stream.write(apSecert.getBytes());  
 MessageDigest md5 = MessageDigest.getInstance("MD5");  
 md5.update(data.getBytes());  
 stream.write(md5.digest());  
 md5.update(stream.toByteArray());  
 byte[] md = md5.digest();  
 byte[] ret = new byte[5]; // 首字节保留0 防止转换成负数, 只使用后4位  
 for (int i = 0; i < md.length; i++)  
 {  
 ret[i % 4 + 1] ^= md[i];  
 }  
 System.out.println("---------------"+new BigInteger(ret));-----得到一个整数  
 }  
 php代码:  
 $string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";  
 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);  
 $data =  array();  
  $data[0]="0";  
 for($i = 0; $i < strlen($md5); $i++){  
     $data[$i % 4 +1] ^=$md5[$i];  
 }  
  $val = 0;   
         $val = $data[1] & 0xff;   
         $val <<= 8;   
         $val |= $data[ 2] & 0xff;   
         $val <<= 8;   
         $val |= $data[3] & 0xff;   
         $val <<= 8;   
         $val |= $data[4] & 0xff;   
 echo $val;    
 最后结果不一样:是不是精度的问题?还是我的代码有问题?  
 java:=2676031167  
 php:=16327680  
  php代码:我第一次发帖的代码,的确有问题,我再重新写一遍  
 $string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";  
 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);  
 $data =  array();  
  $data[0]="0";  
 for($i = 0; $i < strlen($md5); $i++){  
     $data[$i % 4 +1] ^=$md5[$i];  
 }  
  $val = 0;   
         $val = $data[1] & 0xff;   
         $val <<= 8;   
         $val |= $data[ 2] & 0xff;   
         $val <<= 8;   
         $val |= $data[3] & 0xff;   
         $val <<= 8;   
         $val |= $data[4] & 0xff;   
 echo $val; 
   是知道啊?能指出我哪里算错了吗?悬赏100人民币 
   你说 php 运行结果是 16327680  
 但你贴出的代码得到的是 327680  
  
 
   对的,是我写错了,是327680,我对PHP不熟悉,JAVA的值是正确的,我再考虑是不是PHP对位的运算和JAVA存在出入,因为JAVA是unicode编码,造成和php位运算出错? 
   这样写  
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167    
   这样写   
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167     感谢版主,你是高手,结贴了,我如何把钱打给你?