如何解决检查数组索引和长度?
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
}
希望对您有所帮助!
错误信息: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
}
希望对您有所帮助!