2017-08-18 28 views
0

PHP爲什麼在php和java中編碼一個字符串是不同的?

function encrypt($string) 
{ 
     $key_para = "AIBL_#0#[email protected]"; 
     $result = ''; 
     $test = ""; 
     for($i=0; $i<strlen($string); $i++) 
     { 
      $char = substr($string, $i, 1);      
      $a = ($i % strlen($key_para))-1; 
      $keychar = substr($key_para, $a, 1); 

      $inte = ord($char)+ord($keychar); 
      echo $i.'='; 
      echo $inte; 
      echo '</br>';     
      $char = chr($inte); 

      $result.=$char; 
     } 
    echo '</br>'; 
    echo $result; 
    $base64t = base64_encode($result); 
    $res = urlencode($base64t); 
    $f_data = str_replace("%", "_", $res); 

    return $f_data; 
} 

的Java

public static String encrypt(String str) throws UnsupportedEncodingException 
{ 
    String key_para= "AIBL_#0#[email protected]"; 
    String result =""; 
    for(int i=0; i < str.length(); i++) 
    { 
     char ch = str.charAt(i); 
     int a = (i % key_para.length()) -1 ; 
     char keyChar ; 
     if(a < 0) { 
      keyChar = key_para.charAt(key_para.length()+a); 
      } else if(a > 0) { 
      keyChar = key_para.charAt(a); 
      } else { 
      keyChar = key_para.charAt(0); 
     } 
     int temp = ((int) ch + (int) keyChar); 
     System.out.println(i+"="+temp); 
     ch = (char) temp; 
     System.out.println(i+"="+ch); 
     result += ch; 
    } 
    System.out.println(result); 
    String enc=java.util.Base64.getEncoder().encodeToString(result.getBytes()); 
    String res = URLEncoder.encode(enc, "UTF-8"); 
    String f_data = res.replace('%','_') ; 
    return f_data; 
} 

字符串進行加密:

"mobileno=01911222333&accountno=0021120125225&pin=1234" 

輸出應該是:

"rbCrq7jEkZ9gYFJpUnFze3R_2FklZWhJOEn5autbexiY9TYlRhU2BScnZ7dIGFk5mRbVJiVHQ_3D" 

爪哇輸出:

"rbCrq7jEPz9gYFJpUnFze3R_2FP1ZWPz8_2FPz_2ButbexPz9TYlRhU2BScnZ7dD8_2FPz8_2FbVJiVHQ_3D" 

在兩種語言的邏輯是相同的,但是它們的輸出是不同的。
我在做什麼錯?

+0

在使用Base64對字符串進行編碼之前,兩個版本中的'result'是否相同? – xander

+0

另外我看到你的Java代碼已經用'keyChar'變量擴展了邏輯,例如這是什麼'keyChar = key_para.charAt(key_para.length()+ a);'?這應該拋出一個'IndexOutOfBoundsException'! – xander

+0

°««的ΔΣ''RiRqs {噸?VV ?????®μ·±?? SbTaS'Rrv {噸????? mRbTt這是Java đ' 'RiRqs {t VV SbTaS'Rrv{t mRbTt這是在php編碼之前 – Poojan

回答

0

您的代碼工作得很好,除了一兩件事:你打電話str.getBytes()無參數:

將此String解碼使用平臺默認的字符集的字節序列,並將結果存儲到一個新的字節數組。

這就是爲什麼my output was different比你的。

要解決這個問題,你需要指定字節編碼。如果您指定ISO 8859-1字符集,它將按預期工作。

Base64.getEncoder().encodeToString(str.getBytes("ISO-8859-1")) 

如果你想避免編碼的問題,你最好用字節而不是字符。 A character實際上是一個不同的概念,並且需要自己的編碼以字節表示。所以你可以用List<Byte>或其他形式的字節緩衝區替代String result

+0

非常感謝。它的工作! – Poojan

相關問題