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

问题描述 投票:0回答:1

错误消息:System.ArgumentException:'目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。'

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;
}

What I wan to DoFrom VB to C#

请帮助谢谢

c# byte converters
1个回答
0
投票

由于有很多冗余代码,我试图达到您的想法。通过使用:

  • [SubString导出每个字符,即使Encoding.ASCII.GetBytes可以从这些字符返回所有字节数组
  • 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();
}

此功能需要改进,因为它确实循环了2次,第一次循环到字节,第二次进行计算。由于每个字符甚至都可以转换为ASCII,因此我们可以直接将其转换。当输入为Unicode时,例如“Áaa”,Extended ASCII会给出更准确的信息,PassConv3用'?'强制转换为“?aa”代表63个ASCII

Encoding.ASCII.GetByteswill

和结果

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();
}

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.