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

如何在c#中显示每个循环到文本框?,c#,rsa,C#,Rsa,我有一个问题,以显示我的循环代码的fo结果,这是我的代码 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;

我有一个问题,以显示我的循环代码的fo结果,这是我的代码

    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);
        }
    }
private int n=689;
私人INTE=41;
私有整数d=137;
公共无效enkrip()
{
string text=“indra”;
字节[]asciiBytes=Encoding.ASCII.GetBytes(文本);
for(int i=0;i

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

每次循环都会覆盖文本框中的文本


如果要在文本框中输入最后一个字符串,循环应该生成一个字符串,然后循环完成后,将最后一个字符串放入文本框。

在循环的每次迭代中,您都要将
文本设置为单个字符。构建字符串,并将其分配给循环外部的
文本

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);
string text=“indra”;
字节[]asciiBytes=Encoding.ASCII.GetBytes(文本);
char[]结果=新字符[text.Length];
for(int i=0;i
您只能看到文本框中的最后一个值,因为您在循环的每次迭代中都重写了文本框的
.text
属性。即使UI在循环迭代之间进行更新,也会太快而无法感知

您可以在每次迭代中将以下内容附加到文本框:

textBox2.Text += char.ToString(cipher);
或者在循环中构建一个字符串,然后设置文本框(通常是首选解决方案):

var sb=new StringBuilder();
for(int i=0;i
您可能希望将所有结果合并到一个
字符串中

  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)));
  }
请注意,
ascibytes.Length
text.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")));
  }
我最后的建议是提取一种方法:


除了已经给出的答案外,还可以使用
cipher.ToString()
而不是直接从
char
类调用该方法好的,谢谢,但是为什么结果的长度与文本不同呢?你能解释一下吗?@Indra776:最后一个字符有一个代码
1c
(或
28
),因此它是命令字符
FS
(文件分隔符),因此没有显示。在我的编辑中,我还向您显示了字符的代码。如果你不想让命令字符在加密时加32(解密时减32),我现在明白了,这让我搞不清楚最后一个字符为什么消失了,谢谢你的帮助,恐怕我无法帮助诊断,除非你告诉我错误是什么!对不起,这是我的错误,您的代码工作正常,谢谢。谢谢,它工作正常,但我仍然不明白,为什么最后一个字符丢失了。@Indra776:我不太确定。但是在调试器中单步执行应该可以帮助您识别该问题。
  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");