【问题标题】:How to solve Check array index and length?如何解决检查数组索引和长度?
【发布时间】:2020-02-21 02:54:50
【问题描述】:

错误消息: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;
}

请帮忙 谢谢

【问题讨论】:

  • 你到底想在这里做什么?目前,您正在从字符串 (Password) 中获取单个字符,使用 ASCII 编码将其编码为字节,然后尝试将该字节数据视为包含整数的 4 字节二进制值。由于您使用的是 ASCII,我希望 asciiBytes 的长度可能始终为 1。
  • 我假设你真的想要this?
  • 啊,你好像想要this

标签: c# byte converters


【解决方案1】:

由于冗余代码太多,我试图实现您的想法。通过使用:

  • 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 甚至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
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2016-10-29
    • 1970-01-01
    • 2017-08-19
    • 2017-03-13
    • 2021-11-02
    相关资源
    最近更新 更多