2017-01-31 3 views
0

私はここで手に奇妙な質問が少しあります。私は、各文字が別の文字に置き換えられるようにエンコードされたテキストを持っており、各文字を正しい文字に置き換えるアプリケーションを作成しています。しかし、私は問題を解決するのに苦しんでいるのを見つけました。私は例をお見せしましょう:mutliple一度にコールを交換する方法

Original text: This is a line. 
Encoded text: (.T#*T#*%*=T50; 

、私が言ったように、各文字は別の文字を表し、「(」、「T」であるように、実際に 『H』であると

「」。

今、私はちょうど

string decoded = encoded.Replace('(','T'); //T.T#*T#*%*=T50; 

で行くことができそして、それは一つの問題を解決しますが、私は実際にエンコードされた文字「T」の文字に達したときに「私は」私は「私は」で、すべての「T」を置換する必要がありますこれは、以前にデコードされた文字 'T'(以前は '(')であったもの)も、エンコードされた 'T'と共に変化することを意味します。

//T.T#*T#*%*=T50; -> i.i#*i#*%*=i50; 

このような状況では、まず逆に 'T'を 'i'に変更してから '(' '' T ''に変更する必要がありますが、その種の分析を変更することは選択肢ではありません。

私はこのタスクを正しく実行するために何ができるのですか?

ありがとうございました!

+1

ネストした 'string.Replace'ステートメントを使用すると、ひどく非効率的になります。あなたは暗号化アルゴリズムを拡張できますか?それは単にいくつかの関数に応じてASCII値を変更している場合は、あなたの文字列をchar配列として列挙する方が良いでしょう。 –

+0

正規表現 '.replace'を使ってこれを達成することさえできます。このリンクに従ってください。http://stackoverflow.com/questions/7351031/regex-replace-multiple-groups –

答えて

2

可能な解決策の1つは、置換文字列メソッドをまったく使用しないことです。

代わりに、エンコードされたすべてのキャラクタに対して、charという配列を使用して文字列を通過させ、この配列のすべての文字について、デコードされたキャラクタを取得するために "デコードされた文字列を受け取ります。 (新しい文字列を作成するために、StringBulderを使用して)例えば

:あなたが探しているとして、それは文字列全体を毎回覆っているため

.Replace()を使用して
private static char Decode(char source) 
{ 
     if (source == '(') 
      return 'T'; 
     else if (source == '.') 
      return 'h'; 
     //.... and so on 
} 

string source = "ABC"; 

var builder = new StringBuilder(); 
foreach (var c in source) 
    builder.Append(Decode(c)); 

var result = builder.ToString(); 
+0

この例では、 'if/else if'のチェーンの代わりに' switch'ステートメントを使用する方が効率的です。 http://stackoverflow.com/a/395965/2835541 –

1

はおそらく、最初の場所に移動するための方法ではありません。一度文字列全体を変更すると、エンコーディングは失われます。

代わりに、文字列を1回ループして文字を個別に置き換えます。

charを受け入れ、置き換えられたcharを返す関数を作成します。簡単にするために、私は署名を表示します:

private char Decode(char c); 

その後、文字列をループして、各文字でその関数を呼び出してください。 LINQはそれの短い作業することができます:

var decodedString = new string(encodedString.Select(c => Decode(c)).ToArray()); 

を(これはフリーハンドおよびテストされていない、あなたがまたはstringコンストラクタの.ToArray()が幸せになることを必要としない場合があり、私は確かではないよしかし、あなたのアイデアを得ます。 )

読みやすい場合は、文字列を手動でループし、最後にcharをそれぞれStringBuilderとし、最終的なデコード結果を作成することもできます。

+0

を参照してください。あなたとAndy prittyは同じ回答を多く得ました。私はすべての文字を前もって知っていればうまくいきますが、問題は私にはありません。 。 元のテキストは実際には文字*が空白のように見えるようにグリフが変更されているので、文字で手紙にして、それをプログラムで追跡する必要があります。 – DethoRhyne

+0

しかし、私は、入力文字列をchar配列に変換し、 "エンコーディングされた文字"をキーとして持つDictionary >というアイデアを考えました。入力文字列(またはその時点でchar配列)を置き換え、文字列を.Replaceingする代わりに、私はキー文字をチェックし、すべてを置き換えます。私が必要とする時間を何度もやります。 – DethoRhyne

+0

http://i.imgur.com/x83wAju.jpg <テキストの例。強調表示されたテキストをコピーして、検索ウィンドウに貼り付けました。 これはテキストの仕組みです。 – DethoRhyne

0

暗号化アルゴリズムを知らないと、この回答は、それがCaesar Cipherに似た単純な文字変換だと仮定しています。

暗号化された文字列を渡すと、メソッドは各文字をループし、値をshiftDeltaで調整し、結果の文字列を返します。

private string Decrypt(string input) 
{ 
    const int shiftDelta = 10; 

    var inputChars = input.ToCharArray(); 
    var outputChars = new char[inputChars.Length]; 

    for (var i = 0; i < outputChars.Length; i++) 
    { 
     // Perform character translation here 
     outputChars[i] = (char)(inputChars[i] + shiftDelta); 
    } 

    return outputChars.ToString(); 
} 
+0

これはこれがどのように行われたのかもしれないと思っていましたが、私はすでにそれを確認しました。実際に文字がランダムにシフト/選択されて別の文字を表しているように見えます – DethoRhyne

+0

実際に文字がランダムに置き換えられた場合、拒否することを期待するそれとも?私がすでに言ったように、 –

+0

。ここでの問題は、文字自体が「暗号化」されているのではなく、変更されたグリフです。 '*'のグリフは空白なので、すべての '*'が ''などであることがわかっています。 – DethoRhyne

関連する問題