需要在c#中做一个ASCII移位密码
本文关键字:一个 ASCII 密码 | 更新日期: 2023-09-27 18:03:34
我试图将字符串中的字符移位20以匹配我在basic中使用的文件格式。我在c#中使用以下代码
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$命令将其转换回来。
你有两个问题。正如在注释中指出的,下面一行是一个无限循环:
while (pos < t + 1) ;
即使没有循环,移位算法也是不正确的。下面一行也会导致不正确的结果:
temp = temp + 20;
考虑以下反例:
- G映射到[ ]
- ASCII z = 122。122 + 20 = 144,甚至不是一个有效的ASCII字符。
- 大写Z映射为小写n你可以想出其他类似的例子。
顺便说一下,您也可以将这一行重写为temp += 20
。
最后,这一行是不正确的:
text3 =""+ text2.ToString();
您没有将新文本附加到text3,而是在每次进行迭代时替换它,因此text3将始终包含最后一个编码字符(而不是整个字符串)。还要记住,像这样构建c#字符串(尤其是长字符串)是低效的,因为字符串在c#中是不可变的对象。如果所讨论的字符串可能很长,则需要考虑为此使用StringBuilder。