Я пытаюсь реализовать вашу идею из-за большого количества избыточных кодов. Используя:
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
}
Надеюсь, это поможет!