2017-08-18 27 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

相关问题