-1

PHP コードを Java に変換しようとしましたが、意図したとおりに動作しません。数回実行した後、「文字列インデックスが範囲外です」というエラーがループで発生しますchar nextchar = inprogresskey.charAt(ranpos);

PHPコードは次のとおりです。

function munge($address)
    {
        $address = strtolower($address);
        $coded = "";
        $unmixedkey = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";
        $inprogresskey = $unmixedkey;
        $mixedkey="";
        $unshuffled = strlen($unmixedkey);
        for ($i = 0; $i <= strlen($unmixedkey); $i++)
        {
            $ranpos = rand(0,$unshuffled-1);
            $nextchar = $inprogresskey{$ranpos};
            $mixedkey .= $nextchar;
            $before = substr($inprogresskey,0,$ranpos);
            $after = substr($inprogresskey,$ranpos+1,$unshuffled-($ranpos+1));
            $inprogresskey = $before.''.$after;
            $unshuffled -= 1;
        }
        $cipher = $mixedkey;

        $shift = strlen($address);

        for ($j=0; $j<strlen($address); $j++)
        {
            if (strpos($cipher,$address{$j}) == -1 )
            {
                    $chr = $address{$j};
                    $coded .= $address{$j};
            }
            else
            {
                    $chr = (strpos($cipher,$address{$j}) + $shift) % strlen($cipher);
                    $coded .= $cipher{$chr};
            }
        }

        $txt = "<script type=\"text/javascript\" language=\"javascript\">\n";
        $txt .= "\ncoded = \"" . $coded . "\"\n" .
            "  key = \"".$cipher."\"\n".
            "  shift=coded.length\n".
            "  link=\"\"\n".
            "  for (i=0; i<coded.length; i++) {\n" .
            "    if (key.indexOf(coded.charAt(i))==-1) {\n" .
            "      ltr = coded.charAt(i)\n" .
            "      link += (ltr)\n" .
            "    }\n" .
            "    else {     \n".
            "      ltr = (key.indexOf(coded.charAt(i))-
    shift+key.length) % key.length\n".
            "      link += (key.charAt(ltr))\n".
            "    }\n".
            "  }\n".
            "document.write(\"<a href='mailto:\"+link+\"'>\"+link+\"</a>\")\n" .
            "\n".
            "//-"."->\n" .
            "<" . "/script><noscript>N/A" .
            "<"."/noscript>";
        return $txt;
    }

そして私のJavaコードは次のとおりです。

private String encryptEmail(String email)
    {
        String address = email.toLowerCase();
        String coded = "";
        String unmixedkey = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";
        String inprogresskey = unmixedkey;
        String mixedkey = "";
        int unshuffled = unmixedkey.length();

        for (int i = 0; i <= unmixedkey.length(); i++) {
           Random random = new Random();
           int ranpos = random.nextInt(unshuffled - 1);

           char nextchar = inprogresskey.charAt(ranpos);
           mixedkey += nextchar;

           String before = StringUtils.substring(inprogresskey, 0, ranpos);
           String after = StringUtils.substring(inprogresskey, ranpos + 1, unshuffled - (ranpos + 1));
           inprogresskey = before + "" + after;
           unshuffled -= 1;
        }

        String cipher = mixedkey;
        int shift = address.length();

        for (int j = 0; j < address.length(); j++) {
            int chr = -1;
            if (StringUtils.indexOf(cipher, address.substring(j - 1, j)) == -1) {
                coded += address.charAt(j);
            } else {
                chr = (cipher.charAt(j + shift)) % cipher.length();
                coded += cipher.charAt(chr);
            }
       }

       StringBuilder sb = new StringBuilder();
       sb.append("<script type=\"text/javascript\">\n");
       sb.append("var coded = \"" + coded + "\";\n");
       sb.append("var key = \"" + cipher + "\";\n");
       sb.append("var shift = coded.length;\n");
       sb.append("var link = \"\";\n");
       sb.append("for (i = 0; i < coded.length; i++) {\n");
       sb.append("  if (key.indexOf(coded.charAt(i))==-1) {\n");
       sb.append("      ltr = coded.charAt(i);\n");
       sb.append("      link += (ltr);\n");
       sb.append("  }\n");
       sb.append("  else {\n");
       sb.append("      ltr = (key.indexOf(coded.charAt(i))-shift+key.length) % key.length;\n");
       sb.append("      link += (key.charAt(ltr));\n");
       sb.append("  }");
       sb.append("}");
       sb.append("document.write(\"<a rel='nofollow' href='mailto:\" + link + \"'>\" + link + \"</a>\");\n");
       sb.append("</script>");

       return sb.toString();
    }

一部の関数 (charAt、indexOf) を見逃していますか?

ありがとう

4

2 に答える 2

1

前回のループunshuffledと同じで、失敗していると思われます。0charAt(-1)

Eclipse やデバッガーなどの Java IDE を調べてください。ブレークポイントを追加すると、実行中にコードをステップ実行し、すべての変数の値を確認できるようになります。これは、将来この種の問題を解決する最も簡単な方法です。

于 2012-06-26T07:57:45.590 に答える
1

int ranpos = random.nextInt(unshuffled - 1);

やっとranpos = 1

そしてあなたはやっているnextInt(1 - 1)

char nextchar = inprogresskey.charAt(ranpos)

それはあなたにエラーを与える行の上です

あなたがする必要があるのは:

for ループを更新する for (int i = 0; i < unmixedkey.length(); i++)

そしてループ内に以下のコード行を追加します

    if(unshuffled==1)
      {
          ranpos = 1;
      }     
    else {
         ranpos = random.nextInt(unshuffled - 1);
        }

以下は、ループ コードに対して完全に機能します。

for (int i = 0; i < unmixedkey.length(); i++) {
           Random random = new Random();
           int ranpos=0;
           if(unshuffled==1)
           {
               ranpos = 1;
           }else{
               ranpos = random.nextInt(unshuffled - 1);
           }
           char nextchar = inprogresskey.charAt(ranpos);
           mixedkey += nextchar;
           String before = StringUtils.substring(inprogresskey, 0, ranpos);
           String after = StringUtils.substring(inprogresskey, ranpos + 1, unshuffled - (ranpos + 1));
           inprogresskey = before + "" + after;
           unshuffled -= 1;
        }
于 2012-06-26T08:06:29.653 に答える