$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;
最後結果不一樣:是不是精度的問題?還是My Code有問題?
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
感謝版主,你是高手,結貼了,我如何把錢打給你?