Как решить проверить индекс массива и длину? - PullRequest
0 голосов
/ 21 февраля 2020

Сообщение об ошибке: 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 Do From VB to C#

Пожалуйста, помогите Спасибо

1 Ответ

0 голосов
/ 21 февраля 2020

Я пытаюсь реализовать вашу идею из-за большого количества избыточных кодов. Используя:

  • SubString экспортирует каждый символ, даже Encoding.ASCII.GetBytes может вернуть весь байтовый массив из этих символов
  • BitConverter, ожидаемый также для 4-байтового двоичного ввода https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.toint32 и кажется, что эта функция вообще не помогает
  • Объявить iL oop = 1, но внутри l oop делает iL oop - 1
  • sPassConv получает значение от iTotal очень много раз, его следует поместить вне l oop

Быстрое исправление из вашего кода:

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

Эту функцию необходимо улучшить, поскольку она выполняет l oop 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
}

Надеюсь, это поможет!

...