如何在c#中为每个循环显示文本框?

时间:2016-03-30 15:51:56

标签: c# rsa

我在显示循环代码的结果时遇到问题,这是我的代码

    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);
        }
    }

但它没有出现在文本框中,有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

您正在使用每个循环覆盖框中的文本。

如果你想在文本框中输入最后一个字符串,你的循环应该构建一个字符串,然后一旦完成循环,就把最后一个字符串放到你的文本框中。

答案 1 :(得分: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);

答案 2 :(得分:0)

您只会在文本框中看到 last 值,因为您在循环的每次迭代中都覆盖了文本框的.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();

答案 3 :(得分: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");