-1

これはファイルを復号化することになっています。アルゴリズムを理解しようとしていますが、何が起こっているのかを理解するのに少し問題があります。ヒントはありますか?ありがとう!

      localStringBuilder1 = new StringBuilder("");
      localStringBuilder2 = new StringBuilder("");
      Matcher localMatcher = Pattern.compile("[a-zA-z_\\-]+\\.html").matcher(paramString); //paramString is the encrypted file
      localMatcher.find();
      String str2 = localMatcher.group();
for (Integer localInteger1 = Integer.valueOf(0); localInteger1
            .intValue() < str2.length(); localInteger1 = Integer
            .valueOf(1 + localInteger1.intValue())) {
        localStringBuilder2.append(1 + Math.round(str2
                .codePointAt(localInteger1.intValue()) % 3));
        if (localInteger1.intValue() < "fdjkhireuhsdthuirdfg".length())
            localStringBuilder2.append(1 + Math
                    .round("fdjkhireuhsdthuirdfg".codePointAt(localInteger1
                            .intValue()) % 3));
    }

更新:簡略化されたループ

for (int i = 0; i < str2.length(); i++) {
        localStringBuilder2.append(1 + Math.round(str2
                .codePointAt(i) % 3));
        if (i < "fdjkhireuhsdthuirdfg".length())
            localStringBuilder2.append(1 + Math
                    .round("fdjkhireuhsdthuirdfg".codePointAt(i) % 3));
    }

そして、あなたはここで完全なソースコードを見つけることができます

編集 作成された文字列を解決してくれたVandeyに感謝します: "21321223331121"

ただし、これでは完全な答えは得られません。次の部分は(私から地獄を打ち負かす)です:

label249: if (localInteger2.intValue() < i);
    try
    {
      localStringBuilder1.append((char)(Integer.parseInt(str1.substring(0 + localInteger2.intValue(), 2 + localInteger2.intValue()), 16) - Integer.parseInt(localStringBuilder2.substring(localInteger2.intValue() / 2 % localStringBuilder2.length(), 1 + localInteger2.intValue() / 2 % localStringBuilder2.length()))));
      label327: localInteger2 = Integer.valueOf(2 + localInteger2.intValue());
      break label249;
      str3 = localStringBuilder1.toString();
    }
    catch (StringIndexOutOfBoundsException localStringIndexOutOfBoundsException)
    {
      break label327;
    }
4

4 に答える 4

0

ブレークポイントを設定し、実行時にコードを段階的に実行することをお勧めします。さまざまな式を監視し、この情報をコードの機能に使用してください。これは、コードを見て理解しようとするよりもはるかに簡単なはずです。

于 2012-10-03T05:40:44.827 に答える
0

私が見る限り、str2のすべての文字について、stringBuilderはループごとに2桁の数字を追加します。数字は、数字1、2、3で構成されます。つまり、合計9つの数字が可能です。最終的に一連の1,2,3...(順番ではない)を取得し、連続する文字の各ペアは文字のグループを提案しますが、復号化された各文字のトークンは、文字列ビルダーの数字。

また、stringBuilderの連続する数字のペアごとに、2桁の数字は3つしか使用できません。これは、数字の2番目が「fdjk...」文字列によって固定されているためです。

于 2012-10-03T05:48:36.370 に答える
0

str2はここでハードコーディングされており、動作します。そうでない場合は、かなり近いはずです。どなたでも、お気軽に正しい方向に編集してください。最後の印刷行は、何が印刷されるかを確認するために追加されました。そして、誤解を招く変数名をお詫びします。

    String str2 = "abcdefg";
    String toCompare = "fdjkhireuhsdthuirdf(g"; //looks like this changed when  you updated your question
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str2.length(); i++) {
        char ch = str2.charAt(i);
        int charInt1 = ch % 3;

        sb.append(1 + Math.round(charInt1));

        if (i < toCompare.length()) {
            char ch2 = toCompare.charAt(i);
            int charInt2 = ch2 % 3;
            sb.append(1 + Math.round(charInt2));
        }
    }
    System.out.println(sb.toString()); // printed 21321223331121 
于 2012-10-03T05:56:05.433 に答える
0

iLoch、

クラスと関数を見てください。この関数はローカル変数にのみアクセスし、何も返しません(文字列を返す必要があります)。

あなたはそれから何を得るつもりですか?

于 2012-10-03T05:56:26.953 に答える