需要在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$命令将其转换回来。

需要在c#中做一个ASCII移位密码

你有两个问题。正如在注释中指出的,下面一行是一个无限循环:

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。