Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加密/解密崩溃_C#_Modulus_Encryption Asymmetric - Fatal编程技术网

C# 加密/解密崩溃

C# 加密/解密崩溃,c#,modulus,encryption-asymmetric,C#,Modulus,Encryption Asymmetric,我必须为我的C#简介课程编写一个“加密”程序。我遇到了两个问题: 当在解密过程中输入负数或计算负数时,它崩溃。-它返回和未处理的异常错误:System.FormatException:输入字符串的格式不正确 解密应该与加密相反,而不使用原始变量。如何反转余数计算 我知道这是do-while循环的一部分,这就是问题所在,我只是不知道如果输入了负数,如果在解密计算过程中遇到,如何继续提示输入值以防止崩溃。任何指导都将不胜感激。谢谢你看它 public class MainClass { publ

我必须为我的C#简介课程编写一个“加密”程序。我遇到了两个问题:

  • 当在解密过程中输入负数或计算负数时,它崩溃。-它返回和未处理的异常错误:System.FormatException:输入字符串的格式不正确
  • 解密应该与加密相反,而不使用原始变量。如何反转余数计算 我知道这是do-while循环的一部分,这就是问题所在,我只是不知道如果输入了负数,如果在解密计算过程中遇到,如何继续提示输入值以防止崩溃。任何指导都将不胜感激。谢谢你看它

    public class MainClass
    {
      public static void Main(string[] args)
        {
        int num = 0;
        int dnum = 0;
          do
          {
          Console.Write("Please enter a non-negative integer to encrypt: ");
      num = Convert.ToInt32(Console.ReadLine());
          string numstr = Convert.ToString(num);
          string num1 = Convert.ToString(numstr.Substring(0, 1));
          string num2 = Convert.ToString(numstr.Substring(1, 1));
          string num3 = Convert.ToString(numstr.Substring(2, 1));
          string num4 = Convert.ToString(numstr.Substring(3, 1));
          int enum1 = ((Convert.ToInt32(num1) + 7) % 10);
          int enum2 = ((Convert.ToInt32(num2) + 7) % 10);
          int enum3 = ((Convert.ToInt32(num3) + 7) % 10);
          int enum4 = ((Convert.ToInt32(num4) + 7) % 10);
          Console.WriteLine("Encrypted Integer: {0:D4}", (1000 * enum3 + 100 * enum4 + 10 * enum1 + enum2));
    
          Console.Write("Please enter a non-negative integer to decrypt: ");
          dnum = Convert.ToInt32(Console.ReadLine());
          string dnumstr = Convert.ToString(dnum);
          string num1d = Convert.ToString(dnumstr.Substring(0, 1));
          string num2d = Convert.ToString(dnumstr.Substring(1, 1));
          string num3d = Convert.ToString(dnumstr.Substring(2, 1));
          string num4d = Convert.ToString(dnumstr.Substring(3, 1));
          int dnum1 = ((Convert.ToInt32(num1d) - 7) * 10);
          int dnum2 = ((Convert.ToInt32(num2d) - 7) * 10);
          int dnum3 = ((Convert.ToInt32(num3d) - 7) * 10);
          int dnum4 = ((Convert.ToInt32(num4d) - 7) * 10);
          Console.WriteLine("Decrypted Integer: {0:D4}", (1000 * dnum1 + 100 * dnum2 + 10 * dnum3 + dnum4));
            } while (num > 0);
       } // end Main
    }// end class
    

    策略是,在用户输入“正确”输入之前不要继续。这里是代码示例,请注意,我使用
    numstr[0]
    -一个索引来获取第一个字符,而不是
    numstr.Substring(0,1)
    ,因此代码看起来更干净

            int num = 0;
            bool isValid = false;
            do
            {
                Console.Write("Please enter 4 digits to encrypt: ");
                string numstr = Console.ReadLine();
                if (numstr.Length == 4)
                {
                    isValid = Char.IsDigit(numstr[0]) && Char.IsDigit(numstr[1]) 
                           && Char.IsDigit(numstr[2]) && Char.IsDigit(numstr[3]);
                }
                if (isValid)
                    num = Convert.ToInt32(input);
            }
            while (!isValid);
    
    至于第二个问题,您不能使用乘法来反转余数计算
    ((d+7)%10)
    ,您应该再次使用余数运算符
    (d+10-7)%10
    ,添加额外的10是为了防止它得到负结果


    解密过程中还有一个bug,您可以向调试器寻求帮助

    只需检查负数,并告知用户他们不知道如何阅读您的说明,当然要礼貌。@Heather“it崩溃”永远不能充分解释您的问题。你需要提供更多关于坠机的信息。您应该在调试器下运行程序,调试器将为您提供大量关于崩溃的有趣信息(例如调用堆栈),您应该在问题中重现这些信息。当你包含这些信息时,你的问题会更容易得到一个好的答案。@spender-好的观点!对不起,我是这个网站的新用户,正在寻求这方面的帮助。如果输入-,则返回未处理的异常错误:System.FormatException:输入字符串的格式不正确。我面临的问题是,我必须考虑负面因素,即使它可能不是真实世界。