我在显示循环代码的结果时遇到问题,这是我的代码
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 :(得分: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.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")));
}
我的最终建议是提取方法:
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");