-1

我得到以下代码来加密字符串。

    private void Crypt(int n, int m, int d)
    {
        n = Convert.ToInt32(n);
        m = Convert.ToInt32(m);
        d = Convert.ToInt32(d);


        // make a block from the string
        string invoerstring = invoer.Text;
        int stringlength = invoerstring.Length; 
        var blok = invoer.Text.PadRight(stringlength, ' ').Substring(0, stringlength);

        // the letters are shifted d times
        char [] buf = invoerstring.ToArray<char>();
        foreach (char c in buf)
        {
           var letter = uitvoer.Text += (char)( c + (char)d);
        }

        // shift characters inside a block
        var shift = String.Concat(invoerstring.Skip(m).Concat(invoerstring.Take(m)));
        uitvoer.Text = shift;  


    }

    private void button1_Click(object sender, EventArgs e)
    {

        Crypt(8,2,1);

    }

    private void clearbutton_Click(object sender, EventArgs e)
    {
        invoer.Text = "";
        uitvoer.Text = "";
    }


}

}

这是练习的解释:

  • 加密 nmd 文本
  • 文本用空格填充,直到它的长度是 n 的倍数
  • 文本中的字符在字母表中循环移位 d
  • 例如:如果 d = 1 那么 'a' -> 'b' , 'b' -> 'c' .... 等等... 'z' -> 'a'
  • 文本被分成长度为 n 个字符的块
  • 在 n 的每个块内,字符循环向左移动 m 次
  • 移位的组被连接起来

当我运行我的代码时,字母不会移动 d 次。例如字符串:“aap noot mies”必须更改为“q oppubbjft n”(当 Crypt 是 Crypt(8,2,1) 时)。我需要改变什么才能得到这个结果?

4

1 回答 1

3

你有很多问题/奇怪:

  • 您将Convert一堆ints 转换为Int32s,但前者只是后者的语法糖。
  • 您的PadRight调用将返回初始字符串,因为您传递的长度等于string.
  • 您的Substring调用将返回初始字符串。
  • 你从不使用blok.
  • 您实际上从未将输入拆分为块或填充它。
  • string已经实现IEnumerable(您已经隐式使用了这一事实),因此无需将其转换为数组来循环它。
  • 你从不使用letter.
  • (char)( c + (char)d)没有实现您正在寻找的Caeser 密码,您最终会将一些字母转换为非字母(在一种退化的情况下除外)。
  • 您将转换的结果连接到uitvoer.Text(不清除它),然后稍后覆盖它而不使用它。
  • 您正在调用的单参数静态版本Concat(它将传递的对象转换为 a string)并将其传递给string.

首先修复您知道该怎么做的问题,如果遇到困难,请编辑问题。

于 2013-06-08T14:15:59.277 回答