2016-08-23 5 views
-2

私は基本的に使用したファイル形式と一致するように文字列を20文字ずつシフトしようとしています。私はC#は、CでASCIIシフトシフタを実行する必要があります。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace test_controls 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public string text3; 
     private void button1_Click(object sender, EventArgs e) 
     { 
      // This is a test conversion of my pdw save routine from basic to c# 
     int pos = 0; 
     string text = label1.Text; 
     int t = text.Length;  // get the length of the text 
     while (pos < t + 1) ; 
     string s = text.Substring(pos, 1); // get subsstring 1 character at a time 

     byte[] ASCIIValues = Encoding.ASCII.GetBytes(text); // convert that character to ascii 
     foreach (byte b in ASCIIValues) 
     { 
      int temp = b; 
      temp = temp + 20; // add 20 to the ascii value 
      char text2 = Convert.ToChar(temp); // convert the acii back into a char 
      text3 =""+ text2.ToString(); // add the char to the final string 

     } 
     label1.Text = text3; // rewrite the new string to replace the old one for the label1.text 
    } 

} 

}

問題はそれだけで何もしないと反応しないで、次のコードを使用していると私は応答しないプログラムを終了するウィンドウを指示する必要があります。明確にするために、私はC#でwinformsを使ってシフト・サイファーを作っています。このコードのすべては、私はさまざまな答えで見つけて一緒につなぎました。 Vbやその他の基本では、文字列内の各文字のascii値を取得して、数学を実行し、chr $コマンドを使用して戻します。

ご協力いただければ幸いです。

+9

while(pos Cameron

+1

"temp = temp + 20"を実行するのは間違いです。多くの文字が文字ではなくなります。たとえば、2のシフトを行っている場合、 "z"を "b"に対応させると、減算(加算ではありません)が必要になります。この例では、z = 122と122 + 20 = 142が有効なASCII文字ではないことに注意してください。 – EJoshuaS

+0

私はちょうど文字に戻って文字に戻って文字列に戻りたいと思っています。私のファイル形式では、プラス20のため、スペースもスペースがない結果の文字列とは異なる文字になります。次に、必要に応じてプロセスを元に戻し、暗号化された形式で保存して読み込みます。私はそれが一点で自分自身が無限ループではなかったのか疑問に思いました。私がそれをコード化したのは、基本的に私は次のループのために使用したので、whileは文字列の終わりまで処理すると思ったからです。 – Larryrl

答えて

0

あなたには2つの問題があります。コメントで指摘したように、次の行が無限ループです:

while (pos < t + 1) ; 

でもループせずに、しかし、あなたのシフトアルゴリズムが正しくありません。次の行はまた、不正確な結果につながる:

temp = temp + 20; 

以下の場合反例として検討:

  • アスキーZ = 122 122 + 20 = 144に

    • Gマップを有効なASCII文字でもありません。
    • 大文字のZは小文字に変換されますn 他の同様のケースが考えられます。

    なお、この行はtemp += 20と書き直すこともできます。

    最後に、この行が正しくありません:

    text3 =""+ text2.ToString(); 
    

    あなたはそれをあなたが繰り返しを行うたびに交換している、テキスト3に新しいテキストを追加していないので、テキスト3は、常に最後の文字がエンコードされた含まれています(文字列全体ではなく)。このようなC#文字列(特に長いもの)を構築することは、文字列がC#で不変なオブジェクトであるため、非効率的であることにも留意してください。問題の文字列が長い場合は、この目的でStringBuilderを使用することを検討してください。

  • 関連する問題