2016-03-30 50 views
1

我一定要顯示FO的我循環的代碼,結果出了問題,這是我的代碼如何顯示每個循環到c#中的文本框?

private int n = 689; 
    private int e = 41; 
    private int d = 137; 

    public void enkrip() 
    { 
     string text = "indra"; 

     byte[] asciiBytes = Encoding.ASCII.GetBytes(text); 

     for (int i = 0; i < text.Length; i++) 
     { 
      int vout = Convert.ToInt32(asciiBytes[i]); 
      int c = (int)BigInteger.ModPow(vout, e, n); 
      char cipher = Convert.ToChar(c); 
      textBox2.Text = char.ToString(cipher); 
     } 
    } 

,但它不會出現在文本框,任何幫助嗎?

+0

除了已經給答案,你可以用'cipher.ToString(); '而不是直接從'char'類中調用該方法 –

回答

2

您正在用每個循環覆蓋框中的文本。

如果你想要在你的文本框中的最後一個字符串,你的循環應該建立一個字符串,然後一旦循環完成,把最後一個字符串放到你的文本框中。

1

在循環的每次迭代中,您將Text設置爲單個字符。構建串起來,並將其分配給text外循環

string text = "indra"; 

byte[] asciiBytes = Encoding.ASCII.GetBytes(text); 
char[] result = new char[text.Length]; 
for (int i = 0; i < text.Length; i++) 
{ 
    int vout = Convert.ToInt32(asciiBytes[i]); 
    int c = (int)BigInteger.ModPow(vout, e, n); 
    char cipher = Convert.ToChar(c); 
    result[i] = cipher; 
} 
textBox2.Text = new string(result); 
+0

我嘗試了你的代碼,但結果是錯誤的。 – Indra776

+0

我害怕我不能幫助診斷,除非你告訴我什麼是錯誤! – Jamiec

+0

對不起,我的錯誤,你的代碼正常工作, 謝謝。 – Indra776

0

你永遠只能將看到在文本框中的最後價值,因爲你在寫文本框的.Text財產循環的每一次迭代。即使UI在循環迭代之間進行更新,它也會很快被感知。

你可以追加到文本框在每次迭代:

textBox2.Text += char.ToString(cipher); 

或許建立在循環字符串,然後設置文本框後(通常是首選的解決方案):

var sb = new StringBuilder(); 
for (int i = 0; i < text.Length; i++) 
{ 
    //... 
    sb.Append(char.ToString(cipher)); 
} 
textBox2.Text = sb.ToString(); 
+0

謝謝,它的工作原理,但我仍然混淆,爲什麼最後一個字符丟失。 – Indra776

+0

@ Indra776:我不太確定。但是,在調試器中逐步完成應該可以幫助您識別該問題。 – David

0

大概你想要一個結合所有結果變成一個單個string

public void enkrip() { 
    string text = "indra"; 

    byte[] asciiBytes = Encoding.ASCII.GetBytes(text); 

    // "iùŢĕ" 
    textBox2.Text = String.Concat(asciiBytes 
     .Select(b => (char)BigInteger.ModPow(b, e, n))); 
    } 

請注意,asciiBytes.Lengthtext.Length是不同的值(一般情況下)。爲了表示加密文本爲十六進制代碼:

public void enkrip() { 
    string text = "indra"; 

    byte[] asciiBytes = Encoding.ASCII.GetBytes(text); 

    // 0069, 00f9, 0162, 0115, 001c 
    textBox2.Text = String.Join(", ", asciiBytes 
     .Select(b => BigInteger.ModPow(b, e, n).ToString("x4"))); 
    } 

我最後的建議是提取物的方法

public static String Encrypt(String text) { 
    if (String.IsNullOrEmpty(text)) 
     return text; 

    int n = 689; 
    int e = 41; 

    return String.Concat(Encoding.ASCII.GetBytes(text) 
     .Select(b => (char)BigInteger.ModPow(b, e, n))); 
    } 

    ... 

    // and so you can encrypt as easy as 
    textBox2.Text = Encrypt("indra"); 
+0

我應該放置那個代碼? – Indra776

+0

@ Indra776:在'enkrip()'方法中,請參閱我的編輯。 –

+0

好的,謝謝, 但爲什麼結果的長度與文本不一樣? 你能解釋一下嗎? – Indra776

相關問題