如何解决检查数组索引和长度?

How to solve Check array index and length?

错误信息:System.ArgumentException:'Destination array is not long enough to copy all the items in the collection. Check array index and length.'

public static string PassConv(string Password)
{
    int iLoop;
    int iL;
    int iTotal;
    int iValue;
    string sPassConv;

    iL = 3;
    iTotal = 0;

    for (iLoop = 1; iLoop <= Password.Length; iLoop++) {

        string sNo = Password.Substring(iLoop-1,1);

        byte[] asciiBytes = Encoding.ASCII.GetBytes(sNo);

        iValue = BitConverter.ToInt32(asciiBytes, 0); ---->**Error**

        iTotal = iTotal + iValue * (iL + iLoop - 1);  

        sPassConv = iTotal.ToString();

    }
    return sPassConv;
}

请帮忙 感谢

由于冗余代码太多,我尝试达到你的想法。通过使用:

  • SubString 导出每个字符甚至 Encoding.ASCII.GetBytes 可以 return 来自这些字符的所有字节数组
  • BitConverter 也需要 4 字节二进制输入 https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.toint32 看来这个功能一点帮助都没有
  • 声明 iLoop = 1 但内部循环执行 iLoop - 1
  • sPassConv 多次从 iTotal 获取值,应该放在循环外

根据您的代码快速修复:

public static string PassConv(string Password)
{
    int iLoop;
    int iL;
    int iTotal;
    int iValue;
    string sPassConv = "";

    iL = 3;
    iTotal = 0;

    for (iLoop = 1; iLoop <= Password.Length; iLoop++)
    {

        string sNo = Password.Substring(iLoop - 1, 1);

        iValue = Encoding.ASCII.GetBytes(sNo)[0];

        iTotal = iTotal + iValue * (iL + iLoop - 1);

        sPassConv = iTotal.ToString();

    }
    return sPassConv;
}

稍微重构一下

public static string PassConv2(string Password, int iL = 3)
{
    int iTotal = 0;

    var bytes = Encoding.ASCII.GetBytes(Password);

    for (var iLoop = 0; iLoop < bytes.Length; iLoop++)
    {
        // bytes[iLoop] = iValue
        iTotal += bytes[iLoop] * (iL + iLoop);
    }
    return iTotal.ToString();
}

这个函数需要改进,因为它循环了两次,第一次是字节,第二次是计算。由于每个字符都可以转换为 ASCII 甚至 Extended ASCII,所以我们可以直接转换它。 PassConv3 在输入为 Unicode 时给出更准确的信息,例如“Áaa”,Encoding.ASCII.GetByteswill 转换为带有“?”的“?aa”代表 63 个 ASCII

public static string PassConv3(string Password, int iL = 3)
{
    int iTotal = 0;

    for (var iLoop = 0; iLoop < Password.Length; iLoop++)
    {
        iTotal += Password[iLoop] * (iL + iLoop);
    }
    return iTotal.ToString();
}

结果

public static void MainFunc()
{
    Console.WriteLine(PassConv("ABCD")); // 1202
    Console.WriteLine(PassConv2("ABCD")); // 1202
    Console.WriteLine(PassConv3("ABCD")); // 1202
}

希望对您有所帮助!